Java并发(七)线程的对象锁
来源:互联网 发布:淘宝延长收货如何设置 编辑:程序博客网 时间:2024/06/06 07:35
回顾一下对象锁
创建一个线程MyThread2并继承Thread类,重写run方法
class MyThread2 extends Thread{ private StringBuilder sb; public MyThread2(StringBuilder sb){ this.sb = sb; } @Override public void run() { //run方法持有 sb 的锁 synchronized(sb){ sb.reverse(); } System.out.println(sb.toString()); }}
测试方法
public class TestObjectLock { public static void main(String[] args) { // 创建 sb 对象作为下面的的锁 StringBuilder sb = new StringBuilder("ABCDEFG"); MyThread2 mt2 = new MyThread2(sb); mt2.start(); synchronized (sb) { try { // 线程 mt2 获得cpu执行权 mt2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("sb-->"+sb); }}
结果是没有任何输出,线程产生了死锁
分析
线程mt2创建的时候把sb对象传入到mt2对象内部,调用start方法调用run方法,synchronized(sb){…}中使用sb作为对象锁,锁定代码块。
回到主线程,当主线程synchronized(sb){…}中也使用sb作为对象锁,在同步代码块中mt2.join(),把cpu执行权让给mt2,主线程进入阻塞状态,但是并没有释放对象锁sb,等待mt2运行完毕。
但是由于main线程此时拥有对象锁sb,mt2无法拥有sb的锁,导致mt2等待主线程运行完之后才能运行,
此时就产生了这样的情况,主线程阻塞等替代mt2线程运行完才能运行,但是,mt2线程又因为要等待主线程运行完释放对象锁sb,而处在等待状态,所以双方都在等待,结果是双方线程都不运行,就产生了死锁。
0 0
- Java并发(七)线程的对象锁
- java并发(七、高级并发对象)
- Java并发编程系列(七)---- 线程池的使用
- JAVA 并发编程-线程池(七)
- JAVA 并发编程-线程池(七)
- Java并发编程-常量对象(七)
- Java线程总结(七):并发包------线程通信condition
- Java并发编程(七)高级别并发对象
- 【Java-并发】对象的线程安全性
- java线程并发包util.concurrent的研究(七)
- java并发(二、线程对象)
- java线程深度解析(七)——并发数据结构
- java线程深度解析(七)——并发数据结构
- Java线程(七)-线程的调度
- java并发基础(七)--- 加速比、线程开销、减少锁竞争
- Java高并发程序设计笔记(七)锁的优化
- 《Java并发编程实战》---线程安全性---对象的共享
- 《Java并发编程实战》---线程安全性---对象的发布
- 【Kaggle笔记】预测泰坦尼克号乘客生还情况(决策树)
- tiny4412 时钟测试
- C++ 使用STL时自定义比较函数cmp
- 一致性 hash 算法( consistent hashing )
- MFC学习中遇到的问题集合
- Java并发(七)线程的对象锁
- Hadoop渐进五:Hadoop I/O(Sequence, Map, Set...)
- 目标检测之YOLO
- 拷贝构造函数
- mybatis的SqlMapConfig.xml文件的详细配置
- 获取指定应用的名称、版本等信息
- word转html
- 数据类型_类型,变量,成员;以及typedef
- python2.7用pip进行安装时报错Fatal error in launcher: Unable to create process using '"'