一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java-synchronized 嵌套使用代碼詳解

java-synchronized 嵌套使用代碼詳解

2021-01-05 11:20yokasou Java教程

本文以synchronized 的同步造成了死鎖為例,介紹了java-synchronized 嵌套使用代碼詳解,同時對鎖和死鎖的概念進行了說明,需要的朋友可以了解下。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲高清一区二区三区久久 | 精品免费视在线观看 | 91精品国产91热久久久久福利 | 激情文学综合网 | 石原莉奈被店长侵犯免费 | 日本久久免费大片 | 欧美一卡2卡三卡4卡5卡免费观看 | 亚洲成人一区二区 | 亚洲精品国产A久久久久久 亚洲精品福利一区二区在线观看 | 亚洲爱v| 果冻传媒天美传媒乌鸦传媒 | 精品日韩欧美一区二区三区 | 草莓秋葵菠萝蜜绿巨人污 | 天天做天天爱天天爽综合网 | 久久r视频| 91制片厂制作果冻传媒八夷 | 色人阁图片 | 亚洲精品国产一区二区第一页 | ass日本乱妇ass | 天天做天天爱天天爽综合网 | 猛男壮男受bl爽哭了高h | 奇米色7777 | 久久AV国产麻豆HD真实 | 国内精品久久久久影院男同志 | 视频一区二区三区欧美日韩 | 182免费在线观看 | 丝袜护士强制脚足取精 | 亚洲成人网在线 | 久草在线草a免费线看 | 日本xnxnxnxnxn护士 | 色婷婷久久综合中文久久一本 | 日韩成片| 草逼视频免费看 | 成人福利免费在线观看 | 欧美一级精品 | 情人梁家辉在线 | 亚洲天堂99 | 日本视频中文字幕 | 2020国产精品视频免费 | 91久久99热青草国产 | 性伴交换多p|