日韩av无码中文字幕,国产午夜亚洲精品国产成人小说,成人影院午夜男女爽爽爽,欧美 亚洲 中文 国产 综合

首頁(yè) 熱點(diǎn) 要聞 國(guó)內(nèi) 產(chǎn)業(yè) 財(cái)經(jīng) 滾動(dòng) 理財(cái) 股票

當(dāng)前視訊!java中synchronized和ReentrantLock的加鎖和解鎖能在不同線程嗎?如果能,如何實(shí)現(xiàn)?

2023-06-22 18:21:23 來(lái)源 : 博客園

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

答案2023-06-21:


(資料圖)

java的:

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

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

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();        }    }}

運(yùn)行結(jié)果如下:

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

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

go的:

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

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

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

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

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

總結(jié):

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

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

關(guān)鍵詞:
相關(guān)文章

最近更新
精彩推送
安全感拉滿!端午假期武警再現(xiàn)拉鏈?zhǔn)饺藟? 2023-06-22 18:32:43