import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; /**
* ReadWriteLock读写锁:允许多个线程同时读
* 读-读不互斥:读写之间不阻塞
* 读-写互斥:读阻塞写,写阻塞读
* 写-写互斥:写写阻塞
*/
public class ReadWriteLockDemo {
private static Lock lock = new ReentrantLock();
private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private static Lock readLock = readWriteLock.readLock();
private static Lock writeLock = readWriteLock.writeLock();
private int value;
//读
public Object handleRead(Lock lock) throws InterruptedException{
try {
lock.lock();
Thread.sleep(1000);//读操作的耗时越多读写的优势越明显
return value;
} finally {
lock.unlock();
}
}
//写
public void handleWrite(Lock lock,int index) throws InterruptedException{
try {
lock.lock();
Thread.sleep(1000);
value = index;
} finally {
lock.unlock();
}
}
public static void main(String[] args){
final ReadWriteLockDemo demo = new ReadWriteLockDemo();
Runnable readRunnable = () -> {
try {
demo.handleRead(readLock);//读写锁
// demo.handleRead(lock);//重入锁
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable writeRunnable = () -> {
try {
demo.handleWrite(writeLock,new Random().nextInt());//读写锁
// demo.handleWrite(lock,new Random().nextInt());//重入锁
} catch (InterruptedException e) {
e.printStackTrace();
}
};
//读写分离
for (int i = 0; i < 18; i++) {
new Thread(readRunnable).start();
}
for (int i = 18; i < 20; i++) {
new Thread(writeRunnable).start();
}
}
//使用读写锁,由于使用了读写分离,读线程完全并行,而写会阻塞读(注意for循环次数,写线程之间实际是串行的),因此运行大约2秒多结束
//而使用重入锁,所有读写线程之间都必须相互等待,因此执行时间大约20多秒
}

最新文章

  1. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
  2. HTML特殊符号汇总
  3. Android声音播放实例代码
  4. hystrix-turbine 监控的使用
  5. Array-练习-自定义功能
  6. Asp.net MVC中 Controller 与 View之间的数据传递
  7. 收不到Win10正式版预订通知?一个批处理搞定
  8. #c word转换PDF
  9. jquery动态添加列表后样式失效解决方式
  10. python Day 1 - 搭建开发环境
  11. Linux和windows下的shutdown命令
  12. HTML5扩展之微数据与丰富网页摘要itemscope, itemtype, itemprop
  13. JavaEE开发之SpringBoot工程的创建、运行与配置
  14. ES6小点心第二弹——底部浮现弹窗
  15. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习5
  16. 怎样用Python的Scikit-Learn库实现线性回归?
  17. CLR Via 第一 章 知识点整理(1)
  18. apache占用80端口,导致nginx启动不成功
  19. MyEclipse中复制web项目,部署之后访问报错
  20. 日志模块logging介绍

热门文章

  1. springboot支持webSocket和stomp实现消息订阅通知示例
  2. jQuery中keyup() 和 keydown()方法
  3. Python中使用&quot;subplot&quot;在一张画布上显示多张图
  4. C#基础提升系列——C# 泛型
  5. TypeError:NoneType object is not callable情况下的错误
  6. manacher 和 扩展KMP
  7. 【Linux】清理缓存buffer/cache
  8. AcWing 260. 买票 (树状数组+二分)打卡
  9. 安装和使用Redis【转】
  10. 2.2寸(14PIN)TFT液晶屏STM32 SPI 控制