标签:false 线程 dex stat code sleep bsp 运行 ace
当线程中锁中套锁,两个线程在运行时都需要对方所占用的锁而不释放自己的锁,这样就造成了线程的停滞。下面通过一个例子来演示死锁的形成和避免办法。
1 package cn.ftf.threadsafe;
2 /**
3 * 过多的同步可能会造成互相不释放资源,从而相互等待,一般发生于同步中持有多个对象的锁,锁中套锁
4 *
5 * 避免:不要再在同一代码块中同时持有多个对象的锁,避免锁中上锁
6 * @author 房廷飞
7 *
8 */
9 public class DeadLockThread implements Runnable{
10 static Object a=new Object(); //用Static关键字修饰,保证实例化多少个对象都是这同一个同一个对象
11 static Object b=new Object();
12 private boolean flag;
13 public DeadLockThread(boolean flag) {
14 super();
15 this.flag = flag;
16 }
17 @Override
18 public void run() {
19 if(flag) {
20 synchronized (a) {
21 System.out.println("给 a 对象上锁了。");
22 try {
23 Thread.sleep(200);
24 } catch (InterruptedException e) {
25 e.printStackTrace();
26 }
27 synchronized (b) {
28 System.out.println("给 b 对象上锁了。 a 锁中上锁");
29 }
30 }
31 }else {
32 synchronized (b) {
33 System.out.println("给 b 对象上锁了。");
34 try {
35 Thread.sleep(200);
36 } catch (InterruptedException e) {
37 e.printStackTrace();
38 }
39 synchronized (a) {
40 System.out.println("给 a 对象上锁了。 b 锁中上锁");
41 }
42 }
43 }
44 }
45 public static void main(String[] args) {
46 DeadLockThread dead1=new DeadLockThread(true);
47 DeadLockThread dead2=new DeadLockThread(false);
48
49 new Thread(dead1).start();
50 new Thread(dead2).start();
51 }
52 }
53
54 /*
55 运行结果:
56
57 给 b 对象上锁了。
58 给 a 对象上锁了。
59
60 */
61
62 //避免办法:避免锁中上锁
标签:false 线程 dex stat code sleep bsp 运行 ace
原文地址:https://www.cnblogs.com/fangtingfei/p/11256097.html