22.ReadWriteLock读写锁
2024-09-06 03:35:59
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多秒
}
最新文章
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
- HTML特殊符号汇总
- Android声音播放实例代码
- hystrix-turbine 监控的使用
- Array-练习-自定义功能
- Asp.net MVC中 Controller 与 View之间的数据传递
- 收不到Win10正式版预订通知?一个批处理搞定
- #c word转换PDF
- jquery动态添加列表后样式失效解决方式
- python Day 1 - 搭建开发环境
- Linux和windows下的shutdown命令
- HTML5扩展之微数据与丰富网页摘要itemscope, itemtype, itemprop
- JavaEE开发之SpringBoot工程的创建、运行与配置
- ES6小点心第二弹——底部浮现弹窗
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习5
- 怎样用Python的Scikit-Learn库实现线性回归?
- CLR Via 第一 章 知识点整理(1)
- apache占用80端口,导致nginx启动不成功
- MyEclipse中复制web项目,部署之后访问报错
- 日志模块logging介绍
热门文章
- springboot支持webSocket和stomp实现消息订阅通知示例
- jQuery中keyup() 和 keydown()方法
- Python中使用";subplot";在一张画布上显示多张图
- C#基础提升系列——C# 泛型
- TypeError:NoneType object is not callable情况下的错误
- manacher 和 扩展KMP
- 【Linux】清理缓存buffer/cache
- AcWing 260. 买票 (树状数组+二分)打卡
- 安装和使用Redis【转】
- 2.2寸(14PIN)TFT液晶屏STM32 SPI 控制