亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的synchronized有幾種加鎖方式(實(shí)例詳解)

 更新時(shí)間:2024年05月22日 09:21:11   作者:TS86  
在Java中,synchronized關(guān)鍵字提供了內(nèi)置的支持來實(shí)現(xiàn)同步訪問共享資源,以避免并發(fā)問題,這篇文章主要介紹了java的synchronized有幾種加鎖方式,需要的朋友可以參考下

在Java中,synchronized關(guān)鍵字提供了內(nèi)置的支持來實(shí)現(xiàn)同步訪問共享資源,以避免并發(fā)問題。synchronized主要有三種加鎖方式:

1.同步實(shí)例方法

當(dāng)一個(gè)實(shí)例方法被聲明為synchronized時(shí),該方法將同一時(shí)間只能被一個(gè)線程訪問。鎖是當(dāng)前對(duì)象實(shí)例(即this)。

public class SynchronizedInstanceMethod {  
    public synchronized void doSomething() {  
        // 同步代碼塊  
        // 同一時(shí)間只能有一個(gè)線程執(zhí)行這里的代碼  
    }  
    public static void main(String[] args) {  
        SynchronizedInstanceMethod obj = new SynchronizedInstanceMethod();  
        // 創(chuàng)建多個(gè)線程訪問obj的doSomething方法,它們將串行執(zhí)行  
        // ...  
    }  
}

當(dāng)我們創(chuàng)建了兩個(gè)線程來并發(fā)地增加計(jì)數(shù)器,由于我們使用了synchronized,因此計(jì)數(shù)器的增加線程是安全的,即使兩個(gè)線程都在嘗試修改同一個(gè)共享變量。在同步實(shí)例方法中,鎖分別是實(shí)例對(duì)象和類對(duì)象。

public class SynchronizedInstanceMethodExample {  
    private int count = 0;  
    // 同步實(shí)例方法,鎖定的是當(dāng)前對(duì)象的實(shí)例(this)  
    public synchronized void increment() {  
        count++;  
        System.out.println(Thread.currentThread().getName() + " incremented count to " + count);  
    }  
    public static void main(String[] args) {  
        final SynchronizedInstanceMethodExample example = new SynchronizedInstanceMethodExample();  
        // 創(chuàng)建兩個(gè)線程來增加計(jì)數(shù)器  
        Thread thread1 = new Thread(() -> {  
            for (int i = 0; i < 1000; i++) {  
                example.increment();  
            }  
        }, "Thread-1");  
        Thread thread2 = new Thread(() -> {  
            for (int i = 0; i < 1000; i++) {  
                example.increment();  
            }  
        }, "Thread-2");  
        // 啟動(dòng)線程  
        thread1.start();  
        thread2.start();  
        // 等待線程完成  
        try {  
            thread1.join();  
            thread2.join();  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        // 輸出最終計(jì)數(shù)  
        System.out.println("Final count: " + example.count);  
    }  
}

2.同步靜態(tài)方法

當(dāng)一個(gè)靜態(tài)方法被聲明為synchronized時(shí),該方法將同一時(shí)間只能被一個(gè)線程訪問。鎖是Class對(duì)象,而不是實(shí)例對(duì)象。

public class SynchronizedStaticMethod {  
    public static synchronized void doSomethingStatic() {  
        // 同步代碼塊  
        // 同一時(shí)間只能有一個(gè)線程執(zhí)行這里的代碼  
    }  
    public static void main(String[] args) {  
        // 創(chuàng)建多個(gè)線程訪問SynchronizedStaticMethod的doSomethingStatic方法,它們將串行執(zhí)行  
        // ...  
    }  
}

當(dāng)我們創(chuàng)建了兩個(gè)線程來并發(fā)地增加計(jì)數(shù)器,由于我們使用了synchronized,因此計(jì)數(shù)器的增加線程是安全的,即使兩個(gè)線程都在嘗試修改同一個(gè)共享變量。在同步靜態(tài)方法中,鎖分別也是實(shí)例對(duì)象和類對(duì)象。

public class SynchronizedStaticMethodExample {  
    private static int count = 0;  
    // 同步靜態(tài)方法,鎖定的是當(dāng)前對(duì)象的類(Class)對(duì)象  
    public static synchronized void increment() {  
        count++;  
        System.out.println(Thread.currentThread().getName() + " incremented static count to " + count);  
    }  
    public static void main(String[] args) {  
        // 創(chuàng)建兩個(gè)線程來增加計(jì)數(shù)器  
        Thread thread1 = new Thread(() -> {  
            for (int i = 0; i < 1000; i++) {  
                increment();  
            }  
        }, "Thread-1");  
        Thread thread2 = new Thread(() -> {  
            for (int i = 0; i < 1000; i++) {  
                increment();  
            }  
        }, "Thread-2");  
        // 啟動(dòng)線程...  
        // 等待線程完成...  
        // 輸出最終計(jì)數(shù)...  
        // (與上面的例子類似,但省略了重復(fù)的代碼)  
    }  
}

3.同步代碼塊

我們可以使用synchronized關(guān)鍵字來定義一個(gè)代碼塊,而不是整個(gè)方法。在這種情況下,你可以指定要獲取的鎖對(duì)象。這提供了更細(xì)粒度的同步控制。

public class SynchronizedBlock {  
    private final Object lock = new Object(); // 用于同步的鎖對(duì)象  
    public void doSomething() {  
        synchronized (lock) {  
            // 同步代碼塊  
            // 同一時(shí)間只有一個(gè)線程能夠執(zhí)行這里的代碼  
        }  
        // 這里的代碼不受同步代碼塊的約束  
    }  
    public static void main(String[] args) {  
        SynchronizedBlock obj = new SynchronizedBlock();  
        // 創(chuàng)建多個(gè)線程訪問obj的doSomething方法,但只有在synchronized塊中的代碼將串行執(zhí)行  
        // ...  
    }  
}

在上面的SynchronizedBlock類中,我們創(chuàng)建了一個(gè)私有的Object實(shí)例lock作為鎖對(duì)象。當(dāng)線程進(jìn)入synchronized (lock)塊時(shí),它會(huì)嘗試獲取lock對(duì)象的鎖。如果鎖已經(jīng)被其他線程持有,那么該線程將被阻塞,直到鎖被釋放。

當(dāng)我們創(chuàng)建了兩個(gè)線程來并發(fā)地增加計(jì)數(shù)器,同步代碼塊的例子中,我們顯式地指定了一個(gè)對(duì)象作為鎖。

public class SynchronizedBlockExample {  
    private final Object lock = new Object(); // 用于同步的鎖對(duì)象  
    private int count = 0;  
    // 同步代碼塊,指定了鎖對(duì)象  
    public void increment() {  
        synchronized (lock) {  
            count++;  
            System.out.println(Thread.currentThread().getName() + " incremented count to " + count);  
        }  
    }  
    public static void main(String[] args) {  
        // 類似于上面的例子,但使用SynchronizedBlockExample的increment方法  
        // ...(省略了重復(fù)的代碼)  
    }  
}

注意:使用synchronized時(shí)應(yīng)該盡量避免在持有鎖的情況下執(zhí)行耗時(shí)的操作,因?yàn)檫@會(huì)導(dǎo)致其他等待鎖的線程長時(shí)間阻塞。同時(shí),過度使用synchronized可能會(huì)導(dǎo)致性能下降,因?yàn)樗鼤?huì)引入線程間的競(jìng)爭(zhēng)和可能的上下文切換。在設(shè)計(jì)并發(fā)程序時(shí),應(yīng)該仔細(xì)考慮同步的粒度,并可能使用其他并發(fā)工具(如ReentrantLock、Semaphore、CountDownLatch等)來提供更細(xì)粒度的控制。

到此這篇關(guān)于java的synchronized有幾種加鎖方式的文章就介紹到這了,更多相關(guān)java synchronized加鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程優(yōu)先級(jí)和守護(hù)線程原理解析

    Java線程優(yōu)先級(jí)和守護(hù)線程原理解析

    這篇文章主要介紹了Java線程優(yōu)先級(jí)和守護(hù)線程原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring AI TikaDocumentReader詳解

    Spring AI TikaDocumentReader詳解

    TikaDocumentReader是SpringAI中用于從多種格式文檔中提取文本內(nèi)容的組件,支持PDF、DOC/DOCX、PPT/PPTX和HTML等格式,它在構(gòu)建知識(shí)庫、文檔處理和數(shù)據(jù)清洗等任務(wù)中非常有用
    2025-01-01
  • Java中的Native方法

    Java中的Native方法

    這篇文章主要介紹了Java中的Native方法,在本文中,我們將看到j(luò)ava中本機(jī)native方法的介紹。我們將看到它的基本語法及其工作原理。將有java代碼示例展示native本機(jī)方法的使用,下面來看看文章的具體介紹
    2021-12-12
  • SpringBoot無法連接redis的解決方案

    SpringBoot無法連接redis的解決方案

    這篇文章主要介紹了SpringBoot無法連接redis的解決方案,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • 解決spring集成redisson踩過的坑

    解決spring集成redisson踩過的坑

    這篇文章主要介紹了spring集成redisson踩過的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫分表功能

    SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫分表功能

    ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計(jì)劃中)這3款相互獨(dú)立的產(chǎn)品組成,本文給大家介紹SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫分表,感興趣的朋友一起看看吧
    2023-12-12
  • Java排序算法之歸并排序簡單實(shí)現(xiàn)

    Java排序算法之歸并排序簡單實(shí)現(xiàn)

    這篇文章主要介紹了Java排序算法之歸并排序簡單實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 淺析Java?ReentrantLock鎖的原理與使用

    淺析Java?ReentrantLock鎖的原理與使用

    這篇文章主要為大家詳細(xì)介紹了Java中ReentrantLock鎖的原理與使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2023-08-08
  • java編程創(chuàng)建型設(shè)計(jì)模式工廠方法模式示例詳解

    java編程創(chuàng)建型設(shè)計(jì)模式工廠方法模式示例詳解

    這篇文章主要為大家介紹了java編程創(chuàng)建型設(shè)計(jì)模式之工廠方法模式的創(chuàng)建及案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • Java中Struts2的值棧ValueStack詳解

    Java中Struts2的值棧ValueStack詳解

    這篇文章主要介紹了Java中Struts2的值棧ValueStack詳解,值棧(ValueStack)就是 OGNL 表達(dá)式存取數(shù)據(jù)的地方,在一個(gè)值棧中,封裝了一次請(qǐng)求所需要的所有數(shù)據(jù),需要的朋友可以參考下
    2023-08-08

最新評(píng)論