服务器之家

服务器之家 > 正文

java-synchronized 嵌套使用代码详解

时间:2021-01-05 11:20     来源/作者:yokasou

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

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
返回顶部