ReentrantReadWriteLock实现了读锁和写锁的功能,对于读锁和读锁之间,可以并行,读锁和写锁则是互斥的,写锁和写锁之间是互斥的。测试代码如下:
package com.example.test.courrent; import com.example.test.util.AppUtils; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * Created by lixiaoming on 2017/8/25. * 可重入读写锁 * 读锁写锁之间互斥,读锁之间可以并行 * */ public class ReetrantReadWriteLockDemo { private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Runnable read = new Runnable() { @Override public void run() { readWriteLock.readLock().lock(); System.out.println(AppUtils.getTimeLable()+ " in read lock, id is "+Thread.currentThread().getId()); AppUtils.sleep(5); readWriteLock.readLock().unlock(); } }; Runnable write = new Runnable() { @Override public void run() { System.out.println(AppUtils.getTimeLable()+ " try get write lock, id is "+Thread.currentThread().getId()); readWriteLock.writeLock().lock(); System.out.println(AppUtils.getTimeLable()+ " in write lock, id is "+Thread.currentThread().getId()); AppUtils.sleep(5); readWriteLock.writeLock().unlock(); } }; private void testRead2Read(){ Thread t1 = new Thread(read); Thread t2 = new Thread(read); t1.start(); t2.start(); } private void testRead2Write(){ Thread t1 = new Thread(read); Thread t2 = new Thread(write); t1.start(); t2.start(); } private void testWrite2Write(){ Thread t1 = new Thread(write); Thread t2 = new Thread(write); t1.start(); t2.start(); } public static void main(String[] args) { ReetrantReadWriteLockDemo reetrantReadWriteLockDemo = new ReetrantReadWriteLockDemo(); int caseId = 3; switch (caseId){ case 1: reetrantReadWriteLockDemo.testRead2Read(); break; case 2: reetrantReadWriteLockDemo.testRead2Write(); break; case 3: reetrantReadWriteLockDemo.testWrite2Write(); break; } } }
浙公网安备 33010602011771号