ReentrantReadWriteLock中能够生产读锁和写锁。java
读锁和读锁不互斥,写锁和任何读锁或者写锁都互斥。code
demo:读锁和读锁不互斥get
public static void main(String[] args) { ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); final ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock(); final ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock(); for (int i = 0; i < 5; i++) { new Thread(new Runnable() { public void run() { try { readLock.lock(); System.out.println(Thread.currentThread().getName() + " 开始读取数据"); TimeUnit.SECONDS.sleep(5); System.out.println(Thread.currentThread().getName() + " 读取完毕"); } catch (InterruptedException e) { e.printStackTrace(); } finally { readLock.unlock(); } } }).start(); } }
demo读锁和写锁互斥:it
public static void main(String[] args) { ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); final ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock(); final ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock(); for (int i = 0; i < 4; i++) { new Thread(new Runnable() { public void run() { try { readLock.lock(); System.out.println(Thread.currentThread().getName() + " 开始读取数据"); TimeUnit.SECONDS.sleep(5); System.out.println(Thread.currentThread().getName() + " 读取完毕"); } catch (InterruptedException e) { e.printStackTrace(); } finally { readLock.unlock(); } } }).start(); } new Thread(new Runnable() { public void run() { try { writeLock.lock(); System.out.println(Thread.currentThread().getName() + " 开始写入数据"); TimeUnit.SECONDS.sleep(5); System.out.println(Thread.currentThread().getName() + " 读取完毕"); } catch (InterruptedException e) { e.printStackTrace(); } finally { writeLock.unlock(); } } }).start(); }
写锁和写锁互斥:io
public static void main(String[] args) { ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); final ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock(); final ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock(); for (int i = 0; i < 4; i++) { new Thread(new Runnable() { public void run() { try { writeLock.lock(); System.out.println(Thread.currentThread().getName() + " 开始写入数据"); TimeUnit.SECONDS.sleep(5); System.out.println(Thread.currentThread().getName() + " 读取完毕"); } catch (InterruptedException e) { e.printStackTrace(); } finally { writeLock.unlock(); } } }).start(); } }