Java死锁程序(一)
来源:互联网 发布:mac系统做淘宝 编辑:程序博客网 时间:2024/05/22 15:50
思路是创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,A就没办法锁住b,B也没办法锁住a,这时就陷入了死锁。直接贴代码:
public class DeadLock { public static String obj1 = "obj1"; public static String obj2 = "obj2"; public static void main(String[] args){ Thread a = new Thread(new Lock1()); Thread b = new Thread(new Lock2()); a.start(); b.start(); } }class Lock1 implements Runnable{ @Override public void run(){ try{ System.out.println("Lock1 running"); while(true){ synchronized(DeadLock.obj1){ System.out.println("Lock1 lock obj1"); Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2 synchronized(DeadLock.obj2){ System.out.println("Lock1 lock obj2"); } } } }catch(Exception e){ e.printStackTrace(); } }}class Lock2 implements Runnable{ @Override public void run(){ try{ System.out.println("Lock2 running"); while(true){ synchronized(DeadLock.obj2){ System.out.println("Lock2 lock obj2"); Thread.sleep(3000); synchronized(DeadLock.obj1){ System.out.println("Lock2 lock obj1"); } } } }catch(Exception e){ e.printStackTrace(); } }}
运行的结果如图所示:
可以看到,Lock1获取obj1,Lock2获取obj2,但是它们都没有办法再获取另外一个obj,因为它们都在等待对方先释放锁,这时就是死锁。
如果我们只运行Lock1呢?修改一下main函数,把线程b注释掉。
public class DeadLock { public static String obj1 = "obj1"; public static String obj2 = "obj2"; public static void main(String[] args){ Thread a = new Thread(new Lock1()); //Thread b = new Thread(new Lock2()); a.start(); //b.start(); }}class Lock1 implements Runnable{ @Override public void run(){ try{ System.out.println("Lock1 running"); while(true){ synchronized(DeadLock.obj1){ System.out.println("Lock1 lock obj1"); Thread.sleep(3000); synchronized(DeadLock.obj2){ System.out.println("Lock1 lock obj2"); } } } }catch(Exception e){ e.printStackTrace(); } }}class Lock2 implements Runnable{ @Override public void run(){ try{ System.out.println("Lock2 running"); while(true){ synchronized(DeadLock.obj2){ System.out.println("Lock2 lock obj2"); Thread.sleep(3000); synchronized(DeadLock.obj1){ System.out.println("Lock2 lock obj1"); } } } }catch(Exception e){ e.printStackTrace(); } }}
运行结果为:
由于没有其它线程和Lock1争夺obj1和obj2,Lock1可以不断地循环获取并释放它们,这时没有死锁。
1 0
- Java死锁程序(一)
- Java死锁程序
- java线程死锁程序
- java死锁程序
- java 死锁程序
- Java死锁程序(二)
- java多线程 模拟死锁程序
- java中死锁程序和解决死锁的办法
- Java版死锁的例子程序
- Java一个简单的死锁程序
- java线程:一个死锁的小程序
- java 解决死锁(程序模拟)
- Java 程序死锁问题原理及解决方案
- Java 程序死锁问题原理及解决方案
- Java编写一个死锁的程序
- Java 程序死锁问题原理及解决方案
- Java 程序死锁问题原理及解决方案
- Java 程序死锁问题原理及解决方案
- 自定义下拉菜单的收缩实现
- 在window中通过IIS发布自己的网站经验总结
- s3c2440-led驱动分析注释及一次跑马灯测试程序
- 会计核算的基本前提与确认计量的一般原则
- Merge into使用详解( 同时执行inserts和updates操作 )
- Java死锁程序(一)
- 经典开关问题
- [leetcode]Kth Largest Element in an Array
- 两种文件写操作的页缓存数据刷出操作和函数调用路径分析
- 聚类分析学习笔记(一)
- 四种智能指针的用法和原理
- 【VIM】安装YouCompleteMe
- 利用 SSH 完成 Git 与 GitHub 的绑定
- (二)初遇面向对象