读写锁分为读锁和写锁,读锁不是互斥的,多个线程能够同时持有读锁,可是写锁是互斥的,最有有一个在持有。java
public static void main(String[] args) throws Exception { final ReadWriteLock lock = new ReentrantReadWriteLock(); final Lock readLock = lock.readLock(); final Lock writeLock = lock.writeLock(); Thread readThread = new Thread(new Runnable() { @Override public void run() { try { for (int i = 0; i < 5; i++) { readLock.lock(); TimeUnit.SECONDS.sleep(1); System.out.println(Thread.currentThread().getName() + "在读取。。。"); } } catch (InterruptedException e) { e.printStackTrace(); } finally { readLock.unlock(); } } }); Thread readThread2 = new Thread(new Runnable() { @Override public void run() { try { for (int i = 0; i < 5; i++) { readLock.lock(); TimeUnit.SECONDS.sleep(1); System.out.println(Thread.currentThread().getName() + "在读取。。。"); } } catch (InterruptedException e) { e.printStackTrace(); } finally { readLock.unlock(); } } }); readThread.start(); readThread2.start(); }
2、读锁和写锁互斥:ide
public static void main(String[] args) throws Exception { final ReadWriteLock lock = new ReentrantReadWriteLock(); final Lock readLock = lock.readLock(); final Lock writeLock = lock.writeLock(); Thread write = new Thread(new Runnable() { @Override public void run() { writeLock.lock(); try { for (int i = 0; i < 5; i++) { TimeUnit.SECONDS.sleep(1); System.out.println(Thread.currentThread().getName() + "在写入。。。"); } } catch (InterruptedException e) { } finally { writeLock.unlock(); } } }); Thread readThread = new Thread(new Runnable() { @Override public void run() { readLock.lock(); try { for (int i = 0; i < 5; i++) { TimeUnit.SECONDS.sleep(1); System.out.println(Thread.currentThread().getName() + "在读取。。。"); } } catch (InterruptedException e) { e.printStackTrace(); } finally { readLock.unlock(); } } }); write.start(); readThread.start(); }
3、写锁和写锁互斥spa
public static void main(String[] args) throws Exception { final ReadWriteLock lock = new ReentrantReadWriteLock(); final Lock readLock = lock.readLock(); final Lock writeLock = lock.writeLock(); Thread write = new Thread(new Runnable() { @Override public void run() { writeLock.lock(); try { for (int i = 0; i < 5; i++) { TimeUnit.SECONDS.sleep(1); System.out.println(Thread.currentThread().getName() + "在写入。。。"); } } catch (InterruptedException e) { } finally { writeLock.unlock(); } } }); Thread write2 = new Thread(new Runnable() { @Override public void run() { writeLock.lock(); try { for (int i = 0; i < 5; i++) { TimeUnit.SECONDS.sleep(1); System.out.println(Thread.currentThread().getName() + "在写入。。。"); } } catch (InterruptedException e) { e.printStackTrace(); } finally { writeLock.unlock(); } } }); write.start(); write2.start(); }