黑马程序员技术交流社区
标题:
请高手写一个简单的死锁程序,并针对此程序提出解决方法
[打印本页]
作者:
何清林
时间:
2014-2-23 14:57
标题:
请高手写一个简单的死锁程序,并针对此程序提出解决方法
请高手写一个简单的死锁程序,并针对此程序提出几条解决方法:
程序:
写在这里。。。。。
解决方法:
1
2
3
4
谢谢!
作者:
赵永生
时间:
2014-2-23 18:31
03.package com.ljl.thread;
04.public class DealLock implements Runnable {
05. private int flag = 1;
06. // 此对象必须是静态的,同步必须是被多个线程共享
07. static Object resource1 = new Object(), resource2 = new Object();
08.
09. public void run() {
10. if (flag == 1) {
11. synchronized (resource1) {
12. System.out.println("resource1");
13. try {
14. Thread.sleep(1000);
15. } catch (InterruptedException e) {
16. // TODO Auto-generated catch block
17. e.printStackTrace();
18. }
19. synchronized (resource2) {
20. System.out.println("resource2");
21. }
22. }
23. }
24. if (flag == 0) {
25. synchronized (resource2) {
26. System.out.println("resource2");
27. try {
28. Thread.sleep(1000);
29. } catch (InterruptedException e) {
30. // TODO Auto-generated catch block
31. e.printStackTrace();
32. }
33. synchronized (resource1) {
34. System.out.println("resource1");
35. }
36. }
37. }
38. }
39.
40. public static void main(String[] args) {
41. DealLock lock1 = new DealLock();
42. DealLock lock2 = new DealLock();
43. lock1.flag = 1;
44. lock2.flag = 0;
45. Thread ll1 = new Thread(lock1);
46. Thread ll2 = new Thread(lock2);
47. ll1.start();
48. ll2.start();
49. }
50.}
复制代码
作者:
李白衣
时间:
2014-2-23 18:46
public class RunnableTest implements Runnable {
private int flag = 1;
private Object obj1 = new Object(), obj2 = new Object();
public void run() {
System.out.println("flag=" + flag);
if (flag == 1) {
synchronized (obj1) {
System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("1");
}
}
}
if (flag == 0) {
synchronized (obj2) {
System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
RunnableTest run01 = new RunnableTest();
RunnableTest run02 = new RunnableTest();
run01.flag = 1;
run02.flag = 0;
Thread thread01 = new Thread(run01);
Thread thread02 = new Thread(run02);
System.out.println("线程开始喽!");
thread01.start();
thread02.start();
}
}
复制代码
解决方法就是尽量不要在同步代码块中嵌套另一个同步代码块。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2