ReentrantReadWriteLock,讀寫鎖,適用於讀多寫少的狀況,容許多個線程進行讀,可是有寫的進程的時候,就阻塞。ide
public class ReadWriteLockDemo { ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Lock readLock = readWriteLock.readLock(); Lock writeLock = readWriteLock.writeLock(); int num = 0; int num2 = 0; public void readNum() { readLock.lock(); try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } finally { readLock.unlock(); } } public void writeNum() { writeLock.lock(); try { num++; Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } finally { writeLock.unlock(); } } public synchronized void readNum2() { try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } } public void writeNum2() { try { num2++; Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } static class ReadThread extends Thread { ReadWriteLockDemo readWriteLockDemo; public ReadThread(ReadWriteLockDemo readWriteLockDemo) { this.readWriteLockDemo = readWriteLockDemo; } @Override public void run() { long start = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { readWriteLockDemo.readNum(); } System.out.println("ReadThread耗時:" + (System.currentTimeMillis() - start)); } } static class WriteThread extends Thread { ReadWriteLockDemo readWriteLockDemo; public WriteThread(ReadWriteLockDemo readWriteLockDemo) { this.readWriteLockDemo = readWriteLockDemo; } @Override public void run() { long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { readWriteLockDemo.writeNum(); } System.out.println("WriteThread耗時:" + (System.currentTimeMillis() - start)); } } static class ReadThread2 extends Thread { ReadWriteLockDemo readWriteLockDemo; public ReadThread2(ReadWriteLockDemo readWriteLockDemo) { this.readWriteLockDemo = readWriteLockDemo; } @Override public void run() { long start = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { readWriteLockDemo.readNum2(); } System.out.println("ReadThread2耗時:" + (System.currentTimeMillis() - start)); } } static class WriteThread2 extends Thread { ReadWriteLockDemo readWriteLockDemo; public WriteThread2(ReadWriteLockDemo readWriteLockDemo) { this.readWriteLockDemo = readWriteLockDemo; } @Override public void run() { long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { readWriteLockDemo.writeNum2(); } System.out.println("WriteThread2耗時:" + (System.currentTimeMillis() - start)); } } public static void main(String[] args) { ReadWriteLockDemo demo = new ReadWriteLockDemo(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 5; j++) { new ReadThread(demo).start(); // new ReadThread2(demo).start(); } new WriteThread(demo).start(); // new WriteThread2(demo).start(); } } }
運行兩個不一樣的結果,能夠看出,讀寫鎖運行的效率更高this