最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

java中synchronized和ReentrantLock的加鎖和解鎖能在不同線程嗎?如果能,如何實現(xiàn)?

2023-06-21 17:33 作者:福大大架構(gòu)師每日一題  | 我要投稿

java中synchronized和ReentrantLock的加鎖和解鎖能在不同線程嗎?如果能,如何實現(xiàn)?

答案2023-06-21:

java的:

這個問題,我問了一些人,部分人是回答得有問題的。synchronized這是個關(guān)鍵字,加鎖和解鎖不是直接用代碼實現(xiàn),所以在代碼層面上就杜絕了加鎖和解鎖不在同一個線程得情況??梢赃@么說,synchronized是無法實現(xiàn)同一把鎖的加鎖和解鎖在不同線程。

ReentrantLock的加鎖和解鎖,是在代碼層面實現(xiàn)的,所以是可以寫出這樣的代碼,如下:

package?com.hikvision;

import?java.util.concurrent.locks.ReentrantLock;

public?class?Application?{
????private?static?ReentrantLock?lock?=?new?ReentrantLock();
????public?static?void?main(String[]?args)?{
????????//?線程1加鎖
????????Thread?thread1?=?new?Thread(()?->?{
????????????lock.lock();
????????????try?{
????????????????System.out.println("Thread?1?lock.");
????????????}?finally?{
????????????????lock.unlock();
????????????}
????????});

????????//?線程2解鎖
????????Thread?thread2?=?new?Thread(()?->?{
????????????lock.unlock();
????????????System.out.println("Thread?2?unlock.");
????????});

????????thread1.start();
????????try?{
????????????Thread.sleep(1000);?//?等待1秒,確保線程1先執(zhí)行
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????thread2.start();
????????try?{
????????????Thread.sleep(1000);?//?等待1秒,確保線程2先執(zhí)行
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????}
}

運行結(jié)果如下:

在這里插入圖片描述

根據(jù)運行結(jié)果可以看出,ReentrantLock的加鎖和解鎖在代碼層面上可以實現(xiàn),但是運行會報異常。說明ReentrantLock不支持同一把鎖的加鎖和解鎖能在不同線程。

綜上所述:java中synchronized和ReentrantLock的加鎖和解鎖不能在不同線程。

go的:

go的sync.Mutex的加鎖和解鎖能在不同協(xié)程嗎?如果能,如何實現(xiàn)?

sync.Mutex的加鎖和解鎖,是在代碼層面實現(xiàn)的,所以是可以寫出這樣的代碼,如下:

package?main

import?(
????"fmt"
????"sync"
????"time"
)

func?main()?{
????//?加鎖和解鎖可以不在同一個協(xié)程
????var?m?sync.Mutex
????m.Lock()
????fmt.Println("加鎖成功")
????go?func()?{
????????time.Sleep(time.Second?*?5)
????????m.Unlock()
????????fmt.Println("解鎖成功")
????}()
????time.Sleep(time.Hour)
}

在這里插入圖片描述

根據(jù)運行結(jié)果可以看出,sync.Mutex的加鎖和解鎖在代碼層面上可以實現(xiàn),運行也正常。說明sync.Mutex支持同一把鎖的加鎖和解鎖能在不同協(xié)程。

綜上所述:go中sync.Mutex的加鎖和解鎖能在不同線程。

總結(jié):

java中synchronized和ReentrantLock都是可重入鎖,所以在線程上的加鎖和解鎖會做限制,加鎖和解鎖必須在同一線程,并且成對出現(xiàn)。

go的sync.Mutex是不可重入鎖,所以在協(xié)程上的加鎖和解鎖沒做限制。加鎖和解鎖可以不在同一協(xié)程,但要成對出現(xiàn)。


java中synchronized和ReentrantLock的加鎖和解鎖能在不同線程嗎?如果能,如何實現(xiàn)?的評論 (共 條)

分享到微博請遵守國家法律
平定县| 花莲县| 巨鹿县| 遂溪县| 扎囊县| 溧水县| 涪陵区| 乌鲁木齐县| 四子王旗| 博客| 临安市| 绥化市| 青岛市| 庄河市| 贵南县| 富源县| 德庆县| 阳城县| 麻阳| 蓝山县| 孝昌县| 合肥市| 永清县| 武鸣县| 涟源市| 扶余县| 登封市| 江陵县| 潞西市| 项城市| 财经| 宿迁市| 沧源| 北海市| 昆山市| 彭水| 兴山县| 凌源市| 缙云县| 贵港市| 景洪市|