最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java解決線程安全的兩種方式分享

 更新時間:2023年06月13日 10:06:43   作者:掉頭發(fā)的王富貴  
這篇文章主要為大家詳細介紹了Java中兩種常用的解決線程安全的方式——Synchornized和Lock,文中的示例代碼簡潔易懂,快跟隨小編一起學習起來吧

synchornized與lock的不同

synchronized機制在執(zhí)行完相應(yīng)的同步代碼以后,自動的釋放同步監(jiān)視器

lock需要手動的啟動同步(Lock()),同時結(jié)束同步也需要使用手動的實現(xiàn)(unlock())

synchornized方法實現(xiàn)線程同步方法

Synchronized 是 Java 中比較常用的實現(xiàn)線程安全的機制之一,它可以應(yīng)用于方法或代碼塊上,來保證同一時刻只有一個線程能夠訪問到被加鎖的資源。使用 Synchronized 的方式主要有兩種:通過修飾方法實現(xiàn)同步,或者使用 synchronized 代碼塊實現(xiàn)同步。在并發(fā)環(huán)境下,Synchronized 可以確保對同步塊的訪問是互斥的,避免了競爭情況的產(chǎn)生。

public class ThreadBankTest {
    public static void main(String[] args) {
        Account account = new Account(0);
        Customer customer = new Customer(account);
        Customer customer2 = new Customer(account);
        customer.setName("甲");
        customer2.setName("乙");
        customer.start();
        customer2.start();
    }
}

class Customer extends Thread {
    private Account account;


    public Customer(Account account) {
        this.account = account;

    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {

            account.deposit(1000);
        }
    }
}
class Account {
    private int balance;

    public Account(int balance) {
        this.balance = balance;
    }

    //存錢
    public synchronized void deposit(int money) {
        if (money > 0) {
            balance += money;
            System.out.println(Thread.currentThread().getName()+"存錢成功"+balance);

        }
    }
}

但是,Synchronized 也存在一些問題。由于 Synchronized 內(nèi)置于 Java 虛擬機中,因此在獲取鎖的過程中還包含了一些“無謂的”開銷。此外,Synchronized 在性能和靈活性方面都不如 Lock。

Lock實現(xiàn)線程同步的方法

Lock 是 Java 并發(fā)庫中提供的一種訪問并發(fā)共享資源的方式,相比于 Synchronized,Lock 更靈活,更高效,提供了更多的功能。Lock 接口實際上是一組格式良好且相互獨立的線程控制方法,它可以被其他類實現(xiàn)來提供鎖定的實現(xiàn)。使用 Lock 可以支持多個 Condition(條件隊列),在同時滿足某些條件時由不同的線程執(zhí)行任務(wù),從而更加靈活地控制線程的等待、喚醒和通知;并且可以支持可重入鎖和公平鎖的實現(xiàn),提高了線程的競爭程度,避免了死鎖等問題。

public class ThreadBankTest2 {
    public static void main(String[] args) {
        Account2 account2 = new Account2(0);
        Customer2 customer = new Customer2(account2);
        Customer2 customer2 = new Customer2(account2);
        customer.setName("甲");
        customer2.setName("乙");
        customer.start();
        customer2.start();
    }
}

class Customer2 extends Thread {
    private Account2 account;


    public Customer2(Account2 account) {
        this.account = account;

    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            account.deposit(1000);
        }
    }
}

class Account2 {
    private int balance;
    //1.實例化ReentrantLock
    private ReentrantLock lock = new ReentrantLock();

    public Account2(int balance) {
        this.balance = balance;
    }

    //存錢
    public void deposit(int money) {
        try {
            //2.調(diào)用lock方法:要把要同步的代碼放入到try中,try后面的代碼就是要實現(xiàn)同步代碼
            lock.lock();
            if (money > 0) {
                balance += money;
                System.out.println(Thread.currentThread().getName()+"存錢成功"+balance);

            }
        } finally {
            //3.給lock解鎖unlock
            lock.unlock();
        }
    }
}

但是,也需要注意使用 Lock 時可能存在的潛在問題。Lock 是一個接口,因此使用前需要根據(jù)具體場景選擇適當?shù)膶崿F(xiàn)類;如果不恰當?shù)厥褂?Lock 可能會導致系統(tǒng)崩潰或性能下降,并且在實踐中必須手動獲取和釋放鎖。此外,使用 Lock 方式還需要使用 try-finally 塊保護臨界區(qū)代碼以確保一定會釋放鎖。

綜合而言,無論是使用 Synchronized 還是 Lock,都需要根據(jù)具體情況進行選擇。Synchronized 是 Java 內(nèi)置的機制,在簡單場合使用上較為方便,但是效率低下和靈活性不如 Lock,對于實現(xiàn)復雜的多線程編程,Lock 顯然是更好的選擇。無論是哪種方式,都需要謹慎使用,在不影響程序正確性的前提下,盡量去追求程序的高效性和可靠性。

到此這篇關(guān)于Java解決線程安全的兩種方式分享的文章就介紹到這了,更多相關(guān)Java線程安全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • jdk源碼閱讀Collection詳解

    jdk源碼閱讀Collection詳解

    這篇文章主要介紹了jdk源碼閱讀Collection詳解,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • @valid 無法觸發(fā)BindingResult的解決

    @valid 無法觸發(fā)BindingResult的解決

    這篇文章主要介紹了@valid 無法觸發(fā)BindingResult的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Feign如何設(shè)置超時時間(不同情況)

    Feign如何設(shè)置超時時間(不同情況)

    本文主要介紹了Feign的超時時間設(shè)置,包括單獨使用Feign和在SpringCloud環(huán)境下的設(shè)置方式,以及與Ribbon和Hystrix的配合使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • HashMap和List遍歷方法及如何遍歷刪除元素總結(jié)

    HashMap和List遍歷方法及如何遍歷刪除元素總結(jié)

    在本篇文章中小編給大家分享了關(guān)于HashMap和List遍歷方法及如何遍歷刪除元素知識點總結(jié),需要的朋友們參考下。
    2019-05-05
  • Java隨機字符串與簡單加密工具類詳解

    Java隨機字符串與簡單加密工具類詳解

    這篇文章主要介紹了Java隨機字符串與簡單加密工具類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 徹底卸載、更換jdk全過程

    徹底卸載、更換jdk全過程

    本文介紹了卸載舊版JDK并安裝新版JDK的詳細步驟,包括卸載JDK、刪除注冊表中的JavaSoft文件夾、刪除環(huán)境變量、刪除exe文件以及安裝新版JDK
    2026-02-02
  • java繪制五子棋棋盤

    java繪制五子棋棋盤

    這篇文章主要為大家詳細介紹了java繪制五子棋棋盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Java使用poi導出ppt文件的實現(xiàn)代碼

    Java使用poi導出ppt文件的實現(xiàn)代碼

    Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java對Microsoft Office格式檔案讀和寫的功能。本文給大家介紹Java使用poi導出ppt文件的實現(xiàn)代碼,需要的朋友參考下吧
    2021-06-06
  • java中的DTO的使用示例

    java中的DTO的使用示例

    在Java中,DTO代表數(shù)據(jù)傳輸對象,本文主要介紹了java中的DTO的使用示例,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java使用Servlet生成驗證碼圖片

    Java使用Servlet生成驗證碼圖片

    這篇文章主要為大家詳細介紹了Java使用Servlet生成驗證碼圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

杭锦旗| 冀州市| 瓦房店市| 朝阳市| 清原| 濮阳县| 澎湖县| 民丰县| 玉溪市| 萍乡市| 正安县| 苗栗县| 靖江市| 咸阳市| 竹北市| 临夏市| 宜兰县| 两当县| 呼图壁县| 大安市| 长春市| 台东县| 元阳县| 怀仁县| 和静县| 中牟县| 彩票| 镇远县| 北票市| 旺苍县| 景宁| 古田县| 台安县| 乐陵市| 祁门县| 灌南县| 堆龙德庆县| 新干县| 永宁县| 霸州市| 松原市|