网站首页 > java教程 正文
java除了jvm自带的synchronized锁,还有java并发包java.util.concurrent.locks中的ReetrantLock。
ReentrantLock与Synchronized锁区别。
相同点:
两个锁都是悲观锁,可重入锁。
不同点:
synchronized是java原生关键字,基于jvm;ReetrantLock是对象锁,依赖java对象。
synchronized由jvm自动加锁和释放,ReetrantLock需要通过lock、unlock手动释放。
synchronized是非公平锁,ReetrantLock可以通过参数控制公平与非公平。
synchronized只能随机唤醒一个线程或者唤醒所有线程,但是ReetrantLock可以通过Condition精准唤醒线程。
synchronized是不可中断的,除非程序异常,但是ReetrantLock可以中断,通过lock.lockInterruptibly()。
在synchronized优化以前,synchronized的性能比ReenTrantLock差很多,但自jdk1.6版本,synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了。
@Slf4j
public class ThreadCommunicate {
//线程可感知公共变量
volatile int index = 0;
ReentrantLock lock =new ReentrantLock();
Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition();
private void printABC3() {
ThreadCommunicate threadCommunicate = new ThreadCommunicate();
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
try {
threadCommunicate.printA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
try {
threadCommunicate.printB();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread threadC = new Thread(new Runnable() {
@Override
public void run() {
try {
threadCommunicate.printC();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
threadA.start();
threadB.start();
threadC.start();
}
/**
* lock锁与synchronized锁效果一样
*/
public void printA() throws InterruptedException {
lock.lock();
try {
int num=0;
while(num<=9){
if(index!=0){
conditionA.await();
}
log.info("----A----");
num++;
index=1;
conditionB.signal();
}
}finally {
lock.unlock();
}
}
public void printB() throws InterruptedException {
lock.lock();
try {
int num=0;
while(num<=9){
if(index!=1){
conditionB.await();
}
log.info("----B----");
num++;
index=2;
conditionC.signal();
}
}finally {
lock.unlock();
}
}
public void printC() throws InterruptedException {
lock.lock();
try {
int num=0;
while(num<=9){
if(index!=2){
conditionC.await();
}
log.info("----C----");
num++;
index=0;
conditionA.signal();
}
}finally {
lock.unlock();
}
}
}
猜你喜欢
- 2024-10-31 学习廖雪峰的JAVA教程---反射(名叫Class的类、动态加载)
- 2024-10-31 Java案例-求和与打印九九乘法表(用java打印九九乘法口诀)
- 2024-10-31 Java面试题:怎么让两个线程交替打印1和2(生产者消费者问题)
- 2024-10-31 第九章:Java输入输出流和文件操作
- 2024-10-31 Java 自定义注解+AOP 实现日志打印
- 2024-10-31 Java基础学习:java输出整数类型(java分别输出整数和小数)
- 2024-10-31 不懂这些,你敢说自己知道Java标准输入输出流?
- 2024-10-31 Java高阶面试:如何实现三个线程交替循环打印
- 2024-10-31 字节流的输入输出,JAVA基础知识笔记
- 2024-10-31 IntelliJ IDEA 如何针对Java 代码快速打印 println
你 发表评论:
欢迎- 07-15采用Oracle OSB总线进行服务注册和接入
- 07-15javaEE 新闻管理系统 oracle11+tomcat6
- 07-15从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 07-15如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 07-15【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 07-15【mykit-data】 数据库同步工具(数据库表同步工具)
- 07-15[Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- 07-15Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- 最近发表
-
- 采用Oracle OSB总线进行服务注册和接入
- javaEE 新闻管理系统 oracle11+tomcat6
- 从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 【mykit-data】 数据库同步工具(数据库表同步工具)
- [Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- Oracle数据库云服务系列新增前所未有的企业级功能
- 直播预告丨如何实现Oracle存储过程到java的一键转化
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)