欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

synchronized 介紹與使用

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

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

synchronized 基本使用如下:

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

此時我們再使用多線程調(diào)用上面類的 increment 或 getCount 時,就不會出現(xià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 是一種線程同步的機制,它與 synchronized 相似,可以用于控制對共享資源的訪問。相比于 synchronized,Lock 的特點在于更加靈活,支持更多的操作。

Lock 接口定義了以下方法:

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

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

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

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

需要注意的是,使用 Lock 時需要手動獲取和釋放鎖,否則會導(dǎo)致死鎖等問題。因此,一般來說建議使用 try-finally 語句塊來確保鎖的正確釋放。例如:

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ū)別有以下幾個方面:

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

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

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

相關(guān)文章

  • Java之通過OutputStream寫入文件與文件復(fù)制問題

    Java之通過OutputStream寫入文件與文件復(fù)制問題

    這篇文章主要介紹了Java之通過OutputStream寫入文件與文件復(fù)制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java實現(xiàn)超大Excel文件解析(XSSF,SXSSF,easyExcel)

    Java實現(xiàn)超大Excel文件解析(XSSF,SXSSF,easyExcel)

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)超大Excel文件解析(XSSF,SXSSF,easyExcel)以及速度的對比,感興趣的可以了解一下
    2022-07-07
  • java中面向?qū)ο蟮母拍罴爸R點總結(jié)

    java中面向?qū)ο蟮母拍罴爸R點總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于java中面向?qū)ο蟮母拍罴爸R點總結(jié)內(nèi)容,有興趣的朋友們可以參考下。
    2021-01-01
  • Spring中bean的生命周期之getSingleton方法

    Spring中bean的生命周期之getSingleton方法

    今天給大家?guī)淼氖顷P(guān)于Spring的相關(guān)知識,文章圍繞著Spring中bean的生命周期之getSingleton方法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 基于springboot redirect重定向路徑問題總結(jié)

    基于springboot redirect重定向路徑問題總結(jié)

    這篇文章主要介紹了springboot redirect重定向路徑問題總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java使用JSONPath解析JSON完整內(nèi)容詳解

    Java使用JSONPath解析JSON完整內(nèi)容詳解

    這篇文章主要介紹了Java使用JSONPath解析JSON完整內(nèi)容詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 2023最新版IDEA創(chuàng)建javaweb項目的詳細圖文教程

    2023最新版IDEA創(chuàng)建javaweb項目的詳細圖文教程

    之前用的社區(qū)版IDEA無法部署JavaWeb項目,于是裝了一個最新版的IDEA,下面這篇文章主要給大家介紹了關(guān)于2023最新版IDEA創(chuàng)建javaweb項目的詳細圖文教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 圖文詳解JAVA實現(xiàn)快速排序

    圖文詳解JAVA實現(xiàn)快速排序

    這篇文章主要給大家介紹了關(guān)于JAVA實現(xiàn)快速排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • java 使用DecimalFormat進行數(shù)字的格式化實例詳解

    java 使用DecimalFormat進行數(shù)字的格式化實例詳解

    這篇文章主要介紹了java 使用DecimalFormat進行數(shù)字的格式化實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java算法實現(xiàn)預(yù)測雙色球中獎號碼

    java算法實現(xiàn)預(yù)測雙色球中獎號碼

    這篇文章主要介紹了java算法實現(xiàn)預(yù)測雙色球中獎號碼的相關(guān)資料,需要的朋友可以參考下
    2015-12-12

最新評論