关于读写锁的一些理解
同一线程的两种情况:
读读:
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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void run() {readLock.lock();System.out.println("otherRead");readLock.unlock();}});otherRead.start();otherRead.join();//依旧被阻塞,获取不到读锁writeLock.unlock();}
输出:
write