ReentrantReadWriteLock 读写锁
2017-04-28 08:42
417 查看
/** * 读写锁ReentrantReadWriteLock * 读写分离可以有效地减少锁的竞争 * 在ReentrantLock中如果给读线程加锁,那么写线程就需要等待 * 给写线程加锁,那么读线程就得等待 * 这显然是不合理的,因为读操作不会对数据的完整性破坏。 * 所以在读的次数远远大于写的次数的时候,使用读写锁子 * @author beiyaoyao */ public class ReadWriteLockDemo { private static Lock lock = new ReentrantLock(); private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); private static Lock readLock = reentrantReadWriteLock.readLock(); private static Lock writeLock = reentrantReadWriteLock.readLock(); private int value; public Object readMission(Lock lock) throws InterruptedException { try { //描述读操作 lock.lock(); Thread.sleep(1000); return value; } finally { lock.unlock(); } } public void writeMission(Lock lock,int num) throws InterruptedException { try { //描述写操作 lock.lock(); Thread.sleep(1000); value = num; System.out.println(value); } finally { lock.unlock(); } } public static void main(String[] args) { final ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo(); //读线程 Runnable readThread = new Runnable() { @Override public void run() { try { //两把锁子交替使用 // readWriteLockDemo.readMission(readLock); readWriteLockDemo.readMission(lock); } catch (InterruptedException e) { e.printStackTrace(); } } }; //写线程 Runnable writeThread = new Runnable() { @Override public void run() { try { //两把锁子交替使用 // readWriteLockDemo.writeMission(writeLock,new Random().nextInt()); readWriteLockDemo.writeMission(lock,new Random().nextInt()); } catch (InterruptedException e) { e.printStackTrace(); } } }; //夸张的例子 读18次 for(int i = 0 ; i < 18 ; i ++){ new Thread(readThread).start(); } //写2次 for(int i = 0 ; i < 2 ; i ++){ new Thread(writeThread).start(); } } }
如果使用重入锁,那么这段程序的执行时间在20秒左右
如果使用读写锁,那么这段程序的执行时间在2秒左右
相关文章推荐
- ReentrantReadWriteLock读写锁的使用
- ReentrantReadWriteLock读写锁详解
- ReentrantReadWriteLock读写锁的使用
- ReentrantReadWriteLock读写锁的使用
- ReentrantReadWriteLock读写锁的使用<转>
- ReentrantReadWriteLock读写锁的使用
- 多线程读写文件利器-ReentrantReadWriteLock
- ReentrantReadWriteLock 读写锁 概念
- java多线程:并发包中ReentrantReadWriteLock读写锁的原理
- ReentrantReadWriteLock读写锁的使用
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- 深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- 《深入浅出 Java Concurrency》—锁机制(八) 读写锁 (ReentrantReadWriteLock) (1)
- ReadWriteLock rwl = new ReentrantReadWriteLock();读写锁
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- ReentrantReadWriteLock读写锁的使用
- 深入浅出 Java Concurrency (14): 锁机制 part 9 读写锁 (ReentrantReadWriteLock) (2)
- ReentrantReadWriteLock读写锁的使用