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

java線程中synchronized和Lock區(qū)別及介紹

 更新時(shí)間:2023年06月05日 08:33:29   作者:javacn_site  
這篇文章主要為大家介紹了java線程中synchronized和Lock區(qū)別及介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

synchronized 介紹與使用

synchronized 和 Lock 都是 Java 中用于實(shí)現(xiàn)線程同步的機(jī)制,它們都可以保證線程安全。

synchronized 可用來(lái)修飾普通方法、靜態(tài)方法和代碼塊,當(dāng)一個(gè)線程訪問(wèn)一個(gè)被 synchronized 修飾的方法或者代碼塊時(shí),會(huì)自動(dòng)獲取該對(duì)象的鎖,其他線程將會(huì)被阻塞,直到該線程執(zhí)行完畢并釋放鎖。這樣就保證了多個(gè)線程對(duì)共享資源的操作的互斥性,從而避免了數(shù)據(jù)的不一致性和線程安全問(wèn)題。

synchronized 基本使用如下:

public class SynchronizedDemo {
    private int count = 0;
    public synchronized void increment() {
        count++;
    }
    public synchronized int getCount() {
        return count;
    }
}

此時(shí)我們?cè)偈褂枚嗑€程調(diào)用上面類(lèi)的 increment 或 getCount 時(shí),就不會(huì)出現(xiàn)線程安全問(wèn)題了,如下代碼所示:

public class SynchronizedDemoTest {
    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();
        Runnable r = () -> {
            for (int i = 0; i < 1000; i++) {
                demo.increment();
            }
        };
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Count: " + demo.getCount());
    }
}

Lock 介紹與使用

Lock 是一種線程同步的機(jī)制,它與 synchronized 相似,可以用于控制對(duì)共享資源的訪問(wèn)。相比于 synchronized,Lock 的特點(diǎn)在于更加靈活,支持更多的操作。

Lock 接口定義了以下方法:

  • lock():獲取鎖,如果鎖已被其他線程占用,則阻塞當(dāng)前線程。
  • tryLock():嘗試獲取鎖,如果鎖已被其他線程占用,則返回 false,否則返回 true。
  • tryLock(long timeout, TimeUnit unit):嘗試獲取鎖,在指定的時(shí)間范圍內(nèi)獲取到鎖則返回 true,否則返回 false。
  • unlock():釋放鎖。

相比于 synchronized,Lock 的優(yōu)點(diǎn)在于:

  • 粒度更細(xì):synchronized 關(guān)鍵字只能對(duì)整個(gè)方法或代碼塊進(jìn)行同步,而 Lock 可以對(duì)單個(gè)變量或?qū)ο筮M(jìn)行同步。
  • 支持公平鎖:synchronized 不支持公平鎖,而 Lock 可以通過(guò)構(gòu)造函數(shù)指定鎖是否是公平鎖。
  • 支持多個(gè)條件變量:Lock 可以創(chuàng)建多個(gè)條件變量,即多個(gè)等待隊(duì)列。

Lock 的實(shí)現(xiàn)類(lèi)有很多,比較常用的有 ReentrantLock 和 ReentrantReadWriteLock。

需要注意的是,使用 Lock 時(shí)需要手動(dòng)獲取和釋放鎖,否則會(huì)導(dǎo)致死鎖等問(wèn)題。因此,一般來(lái)說(shuō)建議使用 try-finally 語(yǔ)句塊來(lái)確保鎖的正確釋放。例如:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Counter {
    private int count = 0;
    private Lock lock = new ReentrantLock();
    public void increment() {
        // 加鎖
        lock.lock();
        try {
            count++;
        } finally {
            // 釋放鎖
            lock.unlock();
        }
    }
    public void decrement() {
        // 加鎖
        lock.lock();
        try {
            count--;
        } finally {
            // 釋放鎖
            lock.unlock();
        }
    }
    public int getCount() {
        return count;
    }
}

synchronized VS Lock

synchronized 和 Lock 主要的區(qū)別有以下幾個(gè)方面:

  • 鎖的獲取方式:synchronized 是隱式獲取鎖的,即在進(jìn)入 synchronized 代碼塊或方法時(shí)自動(dòng)獲取鎖,退出時(shí)自動(dòng)釋放鎖;而 Lock 需要程序顯式地獲取鎖和釋放鎖,即需要調(diào)用 lock() 方法獲取鎖,調(diào)用 unlock() 方法釋放鎖。
  • 鎖的性質(zhì):synchronized 是可重入的互斥鎖,即同一個(gè)線程可以多次獲得同一把鎖,而且鎖的釋放也只能由獲得鎖的線程來(lái)釋放;Lock 可以是可重入的互斥鎖,也可以是非可重入的互斥鎖,還可以是讀寫(xiě)鎖。
  • 鎖的粒度:synchronized 是以代碼塊和方法為單位進(jìn)行加鎖和解鎖,而 Lock 可以精確地控制鎖的范圍,可以支持多個(gè)條件變量。
  • 性能:在低并發(fā)的情況下,synchronized 的性能優(yōu)于 Lock,因?yàn)?Lock 需要顯式地獲取和釋放鎖,而 synchronized 是在 JVM 層面實(shí)現(xiàn)的;在高并發(fā)的情況下,Lock 的性能可能優(yōu)于 synchronized,因?yàn)?Lock 可以更好地支持高并發(fā)和讀寫(xiě)分離的場(chǎng)景。

總的來(lái)說(shuō),synchronized 的使用更加簡(jiǎn)單,但是在某些場(chǎng)景下會(huì)受到性能的限制;而 Lock 則更加靈活,可以更精確地控制鎖的范圍和條件變量,但是使用起來(lái)比較繁瑣。需要根據(jù)具體的業(yè)務(wù)場(chǎng)景和性能需求來(lái)選擇使用哪種鎖機(jī)制。

以上就是java線程中synchronized和Lock區(qū)別及介紹的詳細(xì)內(nèi)容,更多關(guān)于java線程synchronized Lock的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 10本Java架構(gòu)師必讀書(shū)籍

    10本Java架構(gòu)師必讀書(shū)籍

    這篇文章主要介紹了10本Java架構(gòu)師必讀書(shū)籍,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java中try catch 的基本用法示例

    Java中try catch 的基本用法示例

    這篇文章主要給大家介紹了關(guān)于Java中try catch 的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • spring的TransactionalEventListener事務(wù)感知源碼解析

    spring的TransactionalEventListener事務(wù)感知源碼解析

    這篇文章主要為大家介紹了spring的TransactionalEventListener事務(wù)感知源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 淺談java調(diào)用Restful API接口的方式

    淺談java調(diào)用Restful API接口的方式

    這篇文章主要介紹了淺談java調(diào)用Restful API接口的方式,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java字符串常量池示例詳解

    Java字符串常量池示例詳解

    作為最基礎(chǔ)的引用數(shù)據(jù)類(lèi)型,Java設(shè)計(jì)者為 String 提供了字符串常量池以提高其性能,下面這篇文章主要給大家介紹了關(guān)于Java字符串常量池的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • java sql ResultSet 之getRow()用法說(shuō)明

    java sql ResultSet 之getRow()用法說(shuō)明

    這篇文章主要介紹了java sql ResultSet 之getRow()用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java String保存字符串的機(jī)制

    Java String保存字符串的機(jī)制

    Java中字符串以什么格式來(lái)存儲(chǔ)?Java 中的 Unicode 字符串會(huì)按照 Latin1或者 UTF16 的編碼格式保存在 String 中,本文就詳細(xì)的介紹了一下,感興趣的可以了解一下
    2021-05-05
  • Java的回調(diào)機(jī)制實(shí)例詳解

    Java的回調(diào)機(jī)制實(shí)例詳解

    這篇文章主要介紹了Java的回調(diào)機(jī)制,結(jié)合實(shí)例形式詳細(xì)分析了java回調(diào)機(jī)制相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問(wèn)題

    springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問(wèn)題

    這篇文章主要介紹了springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringBoot中的Condition包下常用條件依賴(lài)注解案例介紹

    SpringBoot中的Condition包下常用條件依賴(lài)注解案例介紹

    這篇文章主要介紹了SpringBoot中的Condition包下常用條件依賴(lài)注解案例,文章基于Java的相關(guān)資料展開(kāi)主題詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04

最新評(píng)論

定陶县| 大丰市| 茌平县| 洛隆县| 三原县| 锡林郭勒盟| 宝坻区| 青神县| 襄垣县| 平南县| 军事| 宝丰县| 黑山县| 寿光市| 安宁市| 兰溪市| 乐山市| 南城县| 濮阳县| 玉林市| 连州市| 江北区| 宜章县| 汉寿县| 如皋市| 兴隆县| 和政县| 昭苏县| 梧州市| 佳木斯市| 纳雍县| 靖西县| 土默特左旗| 延川县| 哈尔滨市| 乐亭县| 绥阳县| 博兴县| 临潭县| 新绛县| 定襄县|