同一线程的两种情况:
读读:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
readLock.lock();
System.out.println("read1");
readLock.lock();
System.out.println("read2");
readLock.unlock();
readLock.unlock();
}
输出:可重入
读写:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
readLock.lock();
System.out.println("read1");
writeLock.lock();
System.out.println("write1");
writeLock.unlock();
readLock.unlock();
}
输出:阻塞了。
写写:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
writeLock.lock();
System.out.println("write1");
writeLock.lock();
System.out.println("write2");
writeLock.unlock();
writeLock.unlock();
}
输出:可重入
写读:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
writeLock.lock();
System.out.println("write1");
readLock.lock();
System.out.println("read1");
readLock.unlock();
writeLock.unlock();
}
输出:文心一言说这种情况是锁降级,我不懂
不同线程的两种情况:
读读:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
readLock.lock();
System.out.println("read1");
Thread otherRead = new Thread(new Runnable() {
@Override
public void run() {
readLock.lock();
System.out.println("otherRead");
readLock.unlock();
}
});
otherRead.start();
otherRead.join();
readLock.unlock();
}
输出:
read1
otherRead
读写:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
readLock.lock();
System.out.println("read1");
Thread otherRead = new Thread(new Runnable() {
@Override
public void run() {
writeLock.lock();
System.out.println("otherWrite");
writeLock.unlock();
}
});
otherRead.start();
otherRead.join();
readLock.unlock();
}
输出:
read1
写写:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
writeLock.lock();
System.out.println("write");
Thread otherRead = new Thread(new Runnable() {
@Override
public void run() {
writeLock.lock();
System.out.println("otherWrite");
writeLock.unlock();
}
});
otherRead.start();
otherRead.join();//等待其他线程完成。但是otherRead无法获取到锁,被阻塞。
writeLock.unlock();
}
输出:
write
写读:
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
writeLock.lock();
System.out.println("write");
Thread otherRead = new Thread(new Runnable() {
@Override
public void run() {
readLock.lock();
System.out.println("otherRead");
readLock.unlock();
}
});
otherRead.start();
otherRead.join();//依旧被阻塞,获取不到读锁
writeLock.unlock();
}
输出:
write