java-synchronized 嵌套使用代码详解

2025-05-29 0 20

synchronized使用过多时,可能会造成死锁,那么死锁到底是怎么一回事呢。先看下面的代码,实现死锁

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61
<span style="color: #00ff00">//死锁的实现

</span>classA

{

publicvoidget(){

System.out.println("<span style="color: #3366ff">A说:我开始启动了,B,给我你的资源</span>");

}

publicvoidsay(){

System.out.println("<span style="color: #3366ff">A获得资源</span>");

}

}

classB

{

publicvoidget(){

System.out.println("<span style="color: #3366ff">B说:我开始启动了,A,给我你的资源</span>");

}

publicvoidsay(){

System.out.println("<span style="color: #3366ff">B获得资源</span>");

}

}

classMyThreadimplementsRunnable

{

publicstaticAa=newA();

publicstaticBb=newB();

publicbooleanflag=false;

publicvoidrun(){

if(flag){

synchronized(a){

a.get();

try{

Thread.sleep(<span style="color: #00ff00">500</span>);

}catch(InterruptedExceptione){}

synchronized(b){ <span style="color: #00ff00">//此</span><span style="color: #00ff00">同步代码块在另一同步代码块里

</span>a.say();

}

}

}else{

synchronized(b){

b.get();

try{

Thread.sleep(<span style="color: #00ff00">500</span>);

}catch(InterruptedExceptione){}

synchronized(a){ <span style="color: #00ff00">//此同步代码块在另一同步代码块里

</span>b.say();

}

}

}

}

}

publicclassDemo24

{

publicstaticvoidmain(Stringargs[]){

MyThreadmt1=newMyThread();

MyThreadmt2=newMyThread();

mt1.flag=<span style="color: #3366ff"><strong>true</strong></span>;

mt2.flag=<span style="color: #3366ff"><strong>false</strong></span>;

Threadth1=newThread(mt1);

Threadth2=newThread(mt2);

th1.start();

th2.start();

}

}

以上代码由于 synchronized 的同步造成了死锁,死锁是两个或多个线程同时等待对方的完成,而程序无法继续执行。在解释代码前,首先要明白synchronized到底是怎么一回事。synchronized 定义同步,那么同步的什么,什么和什么同步了?

首先,我们得知道,什么是。在java中,每一个对象都有一个内部锁,如果以方法或代码块用 synchronized 进行声明,那么对象的锁将保护整个方法或代码块,要调用这个方法或者执行这个代码块,必须获得这个对象的。而且,任何时候都只能有一个线程对象执行被保护的代码

在以上代码中,在线程th1启动后,他就获得了a的锁,同时当其休眠完毕,求会申请获得b的锁,而此时,他的a锁没有放弃。在线程th2启动后,他就获得了b的锁,同时当其休眠完毕,求会申请获得a的锁,而此时,他的b锁没有放弃。

两方都握有自己的锁不放弃,而同时申请另一方的锁,所以,此时就造成了死锁

同步,同步的就是线程和对象,将线程和对象进行绑定,获取对象的锁。

注意:通过以上代码可以发现,死锁的必要条件是不放弃已有的锁,而同时申请新锁。所以,要想实现死锁,就会有synchronized的嵌套。

这样才能同时操作两个以上的锁,从而造成死锁

总结

以上就是本文关于java-synchronized 嵌套使用代码详解的全部内容,希望对大家有所帮助。

原文链接:https://www.2cto.com/kf/201701/582800.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java-synchronized 嵌套使用代码详解 https://www.kuaiidc.com/114719.html

相关文章

发表评论
暂无评论