java死锁
来源:互联网 发布:java开平方函数 编辑:程序博客网 时间:2024/05/22 07:47
java死锁
- java死锁
- 提前准备
- 被锁的是代码块
- 被锁住的是方法
- 被锁住的是静态的方法
- 产生原因
- 实例代码
- javaBean类
- 测试代码
- 运行结果
- 终极大招
- 解决方法
- 更新后的代码
- 提前准备
提前准备
首先我们明白在synchronized关键字在不同情况下的锁是不同的:
被锁的是代码块
synchronized(){ //xxx}
这时可以还是任意的object对象
被锁住的是方法
public synchronized void bowBack(Friend bower) { //xxx }
这时的锁对象是类的隐藏对象this
被锁住的是静态的方法
public static synchronized void bowBack(Friend bower) { //xxx }
默认是这个类字节码的对象,就是XX.class的对象
产生原因
就是对象a持有a的锁,但是此时想调用b对象,但是b对象没有释放锁,而且b也在请求调用a的方法,但是a此时在等待就是阻塞,所以两个对象都在等待,而不能向下执行,产生死锁。
实例代码
说明:参考java官网的实例
主要是一个学生类,类中有两个方法,一个叫起床一个是叫学习;
假如李明和沈墨是好友,互相监督,两个人都有叫他人起床和学习的方法:
javaBean类
负责学生类的创建
public class Student { private final String name; public Student(String name) { this.name = name; } /** * 叫基友起床 * @param jiYou 你的好基友 */ public synchronized void qiChuang(Student jiYou){ System.out.println(this.name+"叫"+jiYou.getName() +"起床了"); jiYou.xueXi(this); System.out.println(); } /** * 叫你的基友学习 * @param xuexi 你的好基友 */ public synchronized void xueXi(Student xuexi){ System.out.println(this.name+"叫"+xuexi.getName()+"学习了"); } public String getName() { return name; }}
测试代码
public class StudentDemo { public static void main(String[] args) { System.out.println("有一对好基友,李明和沈墨,俩人都可以叫对方起床和学习 ");// 名字用用中文只是看c这样玩,所以玩一下,大家不要用 Student 李明 = new Student("李明"); Student 沈墨 = new Student("沈墨"); new Thread(new Runnable() { @Override public void run() { 李明.qiChuang(沈墨); } }).start(); new Thread(new Runnable() { @Override public void run() { 沈墨.qiChuang(李明); } }).start(); }}
运行结果
什么情况,运行失败了????????
为什么没有产生我们想要的结果你????
终极大招
经过作者的洪荒之力终于发现了问题,那就是在是在上面的实例中在李明调用沈墨学习方法时,沈墨没有初始化,也就是没有占用锁,死锁产生的条件不成立,那么失败了。
解决方法
是在不会了,睡一觉再说(#°Д°)
想在李明调用沈墨的学习方法时,让沈墨已经占用锁,我们可以让起床方法先睡一觉,然后在mian方法中继续执行代码也就是第二个线程开启,同时沈墨初始化,让我们再次使出洪荒之力:
程序永远不会结束,一直是红色方块,到此结束。
更新后的代码
public class Student { private final String name; public Student(String name) { this.name = name; } /** * 叫基友起床 * @param jiYou 你的好基友 */ public synchronized void qiChuang(Student jiYou){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.name+"叫"+jiYou.getName() +"起床了"); jiYou.xueXi(this); System.out.println(); } /** * 叫你的基友学习 * @param xuexi 你的好基友 */ public synchronized void xueXi(Student xuexi){ System.out.println(this.name+"叫"+xuexi.getName()+"学习了"); } public String getName() { return name; }}
真的只是睡一觉而已
更多精彩好玩的文章请参见:天意的个人博客没有广告(⊙o⊙)哦
0 0
- java死锁,避免死锁
- Java.死锁
- Java死锁
- java死锁
- java ----死锁
- Java死锁
- java 死锁
- Java - 死锁
- java 死锁
- JAVA 死锁
- java死锁
- java死锁
- Java死锁
- Java - 死锁
- Java 死锁
- java 死锁
- java死锁
- Java死锁
- UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
- 2016计算机网络复习
- (转)java datetime date 类型
- Objective-C总Runtime的那点事儿(一)消息机制
- 16 读取短信内容
- java死锁
- Toolbar的高级性能
- myeclipse导入新工程
- 安卓IPC机制(一)
- iOS缓存机制及实战验证
- 7.22 S POJ 3026 Borg Maze
- 程序连接
- 数据库索引的作用和优点缺点
- 常用主流浏览器的安全机制