国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java多線程:Lock鎖(未完待續(xù))

這篇具有很好參考價(jià)值的文章主要介紹了Java多線程:Lock鎖(未完待續(xù))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Lock鎖的基本使用

在Java中,Lock是一個(gè)接口,它提供了比synchronized關(guān)鍵字更高級(jí)的線程同步機(jī)制。使用Lock接口可以創(chuàng)建更復(fù)雜和靈活的同步結(jié)構(gòu)。

Lock接口的常用實(shí)現(xiàn)類(lèi)有ReentrantLock和ReentrantReadWriteLock,它們提供了可重入的互斥鎖和讀寫(xiě)鎖。

相比synchronized來(lái)實(shí)現(xiàn)同步,使用Lock實(shí)現(xiàn)同步主要有以下差異性:

  1. ?使用synchronized關(guān)鍵字時(shí),鎖的控制和釋放是在synchronized同步代碼塊的開(kāi)始和結(jié)束位置。而在使用Lock實(shí)現(xiàn)同步時(shí),鎖的獲取和釋放可以在不同的代碼塊、不同的方法中。這一點(diǎn)是基于使用者手動(dòng)獲取和釋放鎖的特性。
  2. ?Lock接口提供了試圖獲取鎖的tryLock()方法,在調(diào)用tryLock()獲取鎖失敗時(shí)返回false,這樣線程可以執(zhí)行其它的操作 而不至于使線程進(jìn)入休眠。tryLock()方法可傳入一個(gè)long型的時(shí)間參數(shù),允許在一定的時(shí)間內(nèi)來(lái)獲取鎖。
  3. ?Lock接口的實(shí)現(xiàn)類(lèi)ReentrantReadWriteLock提供了讀鎖和寫(xiě)鎖,允許多個(gè)線程獲得讀鎖、而只能有一個(gè)線程獲得寫(xiě)鎖。讀鎖和寫(xiě)鎖不能同時(shí)獲得。實(shí)現(xiàn)了讀和寫(xiě)的分離,這一點(diǎn)在需要并發(fā)讀的應(yīng)用中非常重要,如lucene允許多個(gè)線程讀取索引數(shù)據(jù)進(jìn)行查詢但只能有一個(gè)線程負(fù)責(zé)索引數(shù)據(jù)的構(gòu)建。
  4. ?基于以上3點(diǎn),lock來(lái)實(shí)現(xiàn)同步具備更好的性能。

使用Lock:

創(chuàng)建Lock對(duì)象。

// 創(chuàng)建Lock對(duì)象
Lock lock = new ReentrantLock();
```

在需要進(jìn)行同步的代碼塊中,通過(guò)調(diào)用`lock()`方法來(lái)獲取鎖。

lock.lock();
try {
    // 同步的代碼
} finally {
    // 在finally塊中釋放鎖,以確保鎖的釋放
    lock.unlock();
}
```

示例代碼如下,多種方式進(jìn)行代碼塊同步:

package ch12;


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


/**
 * @copyright 2003-2024
 * @author    qiao wei
 * @date      2024-01-10
 * @version   1.0
 * @brief     
 * @history   
 */
public class SellTicketThread extends Thread {
    
    public SellTicketThread() {
        ticket = 0;
        lock = new ReentrantLock();
    }

    @Override
    public void run() {
        super.run();
        
//        run01();
        runUseLock04();
    }
    
    private void runUseSynchronized() {
        while (true) {
            synchronized (SellTicketThread.class) {
                if (100 >= ticket) {
                    ++ticket;
//                    sleep(100);
                    System.out.println(getName() + "正在賣(mài)第" + ticket + "門(mén)票");
                } else {
                    break;
                }
            }
        }
    }
    
    /**
     * @author  qiao wei
     * @brief   先處理,后break流程。多處使用類(lèi)Lock的unlock方法。
     * @param   
     * @return  
     * @throws  
     * @history 
     */
    private void runUseLock01() {
        while (true) {
            if (100 >= ticket) {
                lock.lock();
                if (100 >= ticket) {
                    ++ticket;
                    System.out.println(getName() + "正在賣(mài)第" + ticket + "門(mén)票");
                } else {
                    lock.unlock();
                    break;
                }

                lock.unlock();
            } else {
                // 退出while循環(huán)語(yǔ)句。
                break;
            }
        }
    }
    
    /**
     * @author  qiao wei
     * @brief   先處理,后break流程。使用try/finally流程處理類(lèi)Lock的unlock方法。
     * @param   
     * @return  
     * @throws  
     * @history 
     */
    private void runUseLock02() {
        while (true) {
            if (100 >= ticket) {
                try {
                    lock.lock();
                    if (100 >= ticket) {
                        ++ticket;
                        System.out.println(getName() + "正在賣(mài)第" + ticket + "門(mén)票");
                    } else {
                        break;
                    }
                } finally {
                    // 唯一解鎖處。
                    lock.unlock();
                }
            } else {
                // 退出while循環(huán)語(yǔ)句。
                break;
            }
        }
    }
    
    /**
     * @author  qiao wei
     * @brief   先break,后處理流程。多處使用類(lèi)Lock的unlock方法。
     * @param   
     * @return  
     * @throws  
     * @history 
     */
    private void runUseLock03() {
        while (true) {
            if (100 == ticket) {
                break;
            } else {
                lock.lock();

                if (100 == ticket) {
                    lock.unlock();

                    // 退出while循環(huán)語(yǔ)句。
                    break;
                } else {
                    ++ticket;
                    System.out.println(getName() + "正在賣(mài)第" + ticket + "門(mén)票");
                }

                lock.unlock();
            }
        }
    }
    
    /**
     * @author  qiao wei
     * @brief   先break,后處理流程。使用try/finally流程處理類(lèi)Lock的unlock方法。
     * @param   
     * @return  
     * @throws  
     * @history 
     */
    private void runUseLock04() {
        while (true) {
            if (100 == ticket) {
                break;
            } else {
                lock.lock();

                try {
                    if (100 == ticket) {
                        break;
                    } else {
                        ++ticket;
                        System.out.println(getName() + "正在賣(mài)第" + ticket + "門(mén)票");
                    }
                } finally {
                    lock.unlock();
                }
            }
        }
    }
    
    /**
     * @author qiao wei
     * @brief  要出售的總票數(shù)。
     */
    private static int ticket;
    
    /**
     * @author qiao wei
     * @brief  同步鎖。
     */
    private static Lock lock;
}

測(cè)試驗(yàn)證:

package ch12;


/**
 * @copyright 2003-2024
 * @author    qiao wei
 * @date      2024-01-10
 * @version   1.0
 * @brief     
 * @history   
 */
public class TestSynchronized {
    
    public TestSynchronized() {}

    public static void main(String[] args) {
        SellTicketThread thread01 = new SellTicketThread();
        SellTicketThread thread02 = new SellTicketThread();
        SellTicketThread thread03 = new SellTicketThread();
        
        thread01.start();
        thread02.start();
        thread03.start();
    }
}

注意事項(xiàng):

加鎖(lock或synchronized)必須在循環(huán)(while)里面,不軟會(huì)導(dǎo)致一個(gè)線程占用所有資源,而不是多線程切換。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-781568.html

到了這里,關(guān)于Java多線程:Lock鎖(未完待續(xù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vivado使用記錄(未完待續(xù))

    Vivado使用記錄(未完待續(xù))

    字體大小修改:Setting、Font Quick Start 組包含有 Create Project(創(chuàng)建工程)、 Open Project(打開(kāi)工程)、 Open Example Project(打開(kāi)實(shí)例工程)。 Tasks 組包含有 Manage IP(管理 IP)、 Open Hardware Manager(打開(kāi)硬件管理器)、 Xilinx Tcl Store( Tcl 腳本存儲(chǔ)庫(kù))。 Learning Center 組包含有 Documen

    2024年03月09日
    瀏覽(29)
  • TensorFlow學(xué)習(xí)筆記(未完待續(xù))

    TensorFlow學(xué)習(xí)筆記(未完待續(xù))

    TensorFlow中所有計(jì)算都會(huì)被轉(zhuǎn)化為計(jì)算圖上的節(jié)點(diǎn)。是一個(gè)通過(guò)計(jì)算圖的形式來(lái)表述計(jì)算的編程系統(tǒng),每個(gè)計(jì)算都是計(jì)算圖的一個(gè)節(jié)點(diǎn),而節(jié)點(diǎn)之間的邊描述了計(jì)算之間的依賴關(guān)系。 在TensorFlow中,系統(tǒng)會(huì)自動(dòng)維護(hù)一個(gè)默認(rèn)的計(jì)算圖,通過(guò)tf.get_default_graph()函數(shù)可以獲取當(dāng)前

    2024年02月08日
    瀏覽(66)
  • 衛(wèi)星下行鏈路預(yù)算模型(未完待續(xù))

    衛(wèi)星下行鏈路預(yù)算模型(未完待續(xù))

    1. 接收端天線模型 簡(jiǎn)單一些,考慮地球同步衛(wèi)星多波束通信系統(tǒng),波束指向固定。波束數(shù)量為 N b N_b N b ? . 波束中心在地面的位置可以用經(jīng)度向量和緯度向量表示: P ? l g = [ l 1 , l 2 , . . . , l N b ] P ? l a = [ a 1 , a 2 , . . . , a N b ] vec{P}_{lg} = [l_1, l_2,...,l_{N_b}] \\\\ vec{P}_{la} = [a_

    2024年02月03日
    瀏覽(19)
  • PHP復(fù)習(xí)資料(未完待續(xù))

    PHP復(fù)習(xí)資料(未完待續(xù))

    特別鳴謝:@NLER提供雨課堂數(shù)據(jù) (未完待續(xù),請(qǐng)持續(xù)關(guān)注此板塊) 【計(jì)科三四】雪課堂PHP期末模擬題:https://ks.wjx.top/vm/tUAmjxq.aspx# 【計(jì)科一二】PHP第一章練習(xí)題 https://ks.wjx.top/vm/QnjHad4.aspx# 【計(jì)科一二】PHP第二章練習(xí)題 https://ks.wjx.top/vm/h2FvEVI.aspx# 【計(jì)科一二】PHP第三章練習(xí)題

    2024年02月07日
    瀏覽(18)
  • [DASCTF7月賽](未完待續(xù)~)

    [DASCTF7月賽](未完待續(xù)~)

    misc Coffee desu! hint1: Strange Protocol 經(jīng)過(guò)搜索,發(fā)現(xiàn)這個(gè)是一種惡搞協(xié)議: 自定義了一些請(qǐng)求方式 結(jié)合首頁(yè)英文: 我們需要使用 BREW 向服務(wù)器添加 milktea 返回: 這個(gè)協(xié)議定義了: Accept-Additions 頭,于是我們添加上: milktea [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保

    2024年02月16日
    瀏覽(20)
  • Provide/Inject 依賴注入(未完待續(xù))

    Provide/Inject 依賴注入(未完待續(xù))

    父組件傳遞給子組件數(shù)據(jù),通過(guò)props,但是需要逐層傳遞 provide/Inject 的推出就是為了解決這個(gè)問(wèn)題,它提供了一種組件之間共享此類(lèi)值的方式,不必通過(guò)組件樹(shù)每層級(jí)顯示地傳遞props 目的是為了共享那些被 認(rèn)為對(duì)于一個(gè)組件樹(shù)而言是全局的數(shù)據(jù) provide 接受兩個(gè)參數(shù):第一個(gè)參

    2024年01月20日
    瀏覽(18)
  • 新電腦Mac安裝前端環(huán)境,未完待續(xù)~

    新電腦Mac安裝前端環(huán)境,未完待續(xù)~

    電腦:MacBook Pro (15-inch, 2017) 版本接近可以用遷移助理 太久遠(yuǎn)就只能新電腦環(huán)境重裝了, 微信小程序,支付寶小程序,安卓,IOS 無(wú)非這幾種 以下就是一名前端小程序開(kāi)發(fā)人員環(huán)境配置步驟 僅供參考 純新電腦安裝 ——————————————前端常用的工具安裝————

    2024年02月09日
    瀏覽(24)
  • kafka大數(shù)據(jù)采集技術(shù)實(shí)驗(yàn)(未完待續(xù))

    kafka大數(shù)據(jù)采集技術(shù)實(shí)驗(yàn)(未完待續(xù))

    下載地址:https://link.zhihu.com/?target=https%3A//kafka.apache.org/downloads 解壓 啟動(dòng)zookeeper 需要注意的是 : \\\" c o n f i g / z o o k e e p e r . p r o p e r t i e s \\\" 目錄和 \\\" / c o n f i g / z o o k e e p e r . p r o p e r t i e s \\\" 目錄是不同的 . 前者指當(dāng)前目錄中 c o n f i g 目錄下的 z o o k e e p e r . p r o p e r t

    2024年04月29日
    瀏覽(50)
  • 源碼學(xué)習(xí):web server althttpd (未完待續(xù))

    https://sqlite.org/althttpd/dir?ci=tip (推薦) https://github.com/jesrui/althttpd/tree/master (舊版本) https://sqlite.org/althttpd/file?name=althttpd.mdci=tip 輕量級(jí) web 服務(wù)器,設(shè)計(jì)宗旨是追求簡(jiǎn)潔、安全和低資源占用。 設(shè)計(jì)理念 Althttpd通常是通過(guò)xinetd、systemd或類(lèi)似的工具啟動(dòng)的。針對(duì)每個(gè)傳入的連接

    2024年01月21日
    瀏覽(19)
  • QT實(shí)戰(zhàn)之翻金幣游戲【未完待續(xù)】

    QT實(shí)戰(zhàn)之翻金幣游戲【未完待續(xù)】

    目錄 前言 一、游戲整體分析 二、創(chuàng)建項(xiàng)目 三、添加資源 四、主界面實(shí)現(xiàn) 1、設(shè)置游戲主場(chǎng)景基本配置 2、設(shè)置背景圖片 3、創(chuàng)建開(kāi)始按鈕并設(shè)置動(dòng)畫(huà) 4、創(chuàng)建關(guān)卡選擇界面并實(shí)現(xiàn)主界面與其的切換 五、關(guān)卡選擇界面實(shí)現(xiàn) 1、設(shè)置關(guān)卡選擇場(chǎng)景基本配置 2、設(shè)置關(guān)卡選擇場(chǎng)景的

    2024年02月09日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包