成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java線程--最小同步鎖

kamushin233 / 1226人閱讀

摘要:別的線程想要拿到鎖,就必須等待當(dāng)前線程執(zhí)行完成并釋放鎖,才能再次給對象加鎖,達(dá)到線程同步互斥作用。為了提升線程執(zhí)行效率,就要最小化同步代碼塊,最小化鎖粒度。

在java中處理線程并發(fā)問題,可以簡單的加上synchronized,可以在方法或方法內(nèi)的代碼塊添加,那現(xiàn)在的問題是,synchronized是鎖住了方法還是代碼塊還是實(shí)例對象?
加在方法上:

class Sync {
    public synchronized void test() {
        System.out.println("test開始..");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("test結(jié)束..");
    }
}

class MyThread extends Thread {
    public void run() {
        Sync sync = new Sync();
        sync.test();
    }
}

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            Thread thread = new MyThread();
            thread.start();
        }
    }
}

運(yùn)行結(jié)果: test開始.. test開始.. test開始.. test結(jié)束.. test結(jié)束.. test結(jié)束
可以看到,上面啟了3個線程,每個線程實(shí)例化一個Sync并調(diào)用其方法,所以這里synchronized沒有作用,因?yàn)榫€程都加了各自的同步鎖,無互斥。

若把test方法上加上static,則運(yùn)行結(jié)果如下:
test開始.. test結(jié)束.. test開始.. test結(jié)束.. test開始.. test結(jié)束
因?yàn)榇藭r,3個線程的同步鎖是Sync類對象而不是類實(shí)例。

public static synchronized void test() {
        System.out.println("test開始..");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("test結(jié)束..");
    }

注:線程sleep時,并不會釋放鎖.

接下來,把synchronized加到this上,如下:

public void test() {
     synchronized(this) {
        System.out.println("test開始..");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("test結(jié)束..");
    }
}

運(yùn)行結(jié)果:test開始.. test開始.. test開始.. test結(jié)束.. test結(jié)束.. test結(jié)束
同樣的道理,這里的同步鎖是自各的對象實(shí)例,3個線程互不影響,沒有互斥作用

由此得知,synchronized在方法上鎖的是對象實(shí)例,在代碼塊里鎖的是括號里的對象。別的線程想要拿到鎖,就必須等待當(dāng)前線程執(zhí)行完成并釋放鎖,才能再次給對象加鎖,達(dá)到線程同步互斥作用。
為了提升線程執(zhí)行效率,就要最小化同步代碼塊,最小化鎖粒度。

上面使用static實(shí)現(xiàn)了線程互斥,其實(shí)也可以用同一個對象來實(shí)現(xiàn)線程互斥,如下:

class MyThread extends Thread {
    private Sync sync;
    public MyThread(Sync sync) {
        this.sync = sync;
    }
    public void run() {
        sync.test();
    }
}

public class Main {
    public static void main(String[] args) {
        Sync sync = new Sync();
        for (int i = 0; i < 3; i++) {
            Thread thread = new MyThread(sync);
            thread.start();
        }
    }
}

運(yùn)行結(jié)果:test開始.. test結(jié)束.. test開始.. test結(jié)束.. test開始.. test結(jié)束
可以看到,線程同步互斥了

更好的做法是,直接鎖住這個對象的class對象,與static相同,如下:

class Sync {
    public void test() {
        synchronized (Sync.class) {
            System.out.println("test開始..");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("test結(jié)束..");
        }
    }
}

class MyThread extends Thread {
    public void run() {
        Sync sync = new Sync();
        sync.test();
    }
}

運(yùn)行結(jié)果:test開始.. test結(jié)束.. test開始.. test結(jié)束.. test開始.. test結(jié)束
可以看到,線程仍然同步互斥

綜上,若需要同步鎖,盡量最小化同步塊。
學(xué)習(xí)交流,歡迎加群:64691032

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76983.html

相關(guān)文章

  • Java 并發(fā)編程(學(xué)習(xí))

    摘要:并發(fā)編程的挑戰(zhàn)并發(fā)編程的目的是為了讓程序運(yùn)行的更快,但是,并不是啟動更多的線程就能讓程序最大限度的并發(fā)執(zhí)行。的實(shí)現(xiàn)原理與應(yīng)用在多線程并發(fā)編程中一直是元老級角色,很多人都會稱呼它為重量級鎖。 并發(fā)編程的挑戰(zhàn) 并發(fā)編程的目的是為了讓程序運(yùn)行的更快,但是,并不是啟動更多的線程就能讓程序最大限度的并發(fā)執(zhí)行。如果希望通過多線程執(zhí)行任務(wù)讓程序運(yùn)行的更快,會面臨非常多的挑戰(zhàn):(1)上下文切換(2)死...

    NervosNetwork 評論0 收藏0
  • 分布式機(jī)制原理及實(shí)現(xiàn)方式

    摘要:分布式鎖實(shí)現(xiàn)方式前言目前幾乎很多大型網(wǎng)站及應(yīng)用都是分布式部署的,分布式場景中的數(shù)據(jù)一致性問題一直是一個比較重要的話題?;跀?shù)據(jù)庫實(shí)現(xiàn)分布式鎖基于緩存等實(shí)現(xiàn)分布式鎖基于實(shí)現(xiàn)分布式鎖。 前言 分布式鎖,是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式 在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機(jī)之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...

    yacheng 評論0 收藏0
  • 分布式機(jī)制原理及實(shí)現(xiàn)方式

    摘要:分布式鎖實(shí)現(xiàn)方式前言目前幾乎很多大型網(wǎng)站及應(yīng)用都是分布式部署的,分布式場景中的數(shù)據(jù)一致性問題一直是一個比較重要的話題。基于數(shù)據(jù)庫實(shí)現(xiàn)分布式鎖基于緩存等實(shí)現(xiàn)分布式鎖基于實(shí)現(xiàn)分布式鎖。 前言 分布式鎖,是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式 在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機(jī)之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...

    Travis 評論0 收藏0
  • Java面試 32個核心必考點(diǎn)完全解析

    摘要:如問到是否使用某框架,實(shí)際是是問該框架的使用場景,有什么特點(diǎn),和同類可框架對比一系列的問題。這兩個方向的區(qū)分點(diǎn)在于工作方向的側(cè)重點(diǎn)不同。 [TOC] 這是一份來自嗶哩嗶哩的Java面試Java面試 32個核心必考點(diǎn)完全解析(完) 課程預(yù)習(xí) 1.1 課程內(nèi)容分為三個模塊 基礎(chǔ)模塊: 技術(shù)崗位與面試 計算機(jī)基礎(chǔ) JVM原理 多線程 設(shè)計模式 數(shù)據(jù)結(jié)構(gòu)與算法 應(yīng)用模塊: 常用工具集 ...

    JiaXinYi 評論0 收藏0
  • Synchronized原理分析

    摘要:而導(dǎo)致這個問題的原因是線程并行執(zhí)行操作并不是原子的,存在線程安全問題。如果已經(jīng)有線程持有了鎖,那這個線程會獨(dú)占鎖,直到鎖釋放完畢之前,其他線程都會被阻塞。當(dāng)鎖處于重量級鎖狀態(tài),其他線程嘗試獲取鎖時,都會被阻塞,也就是狀態(tài)。 1. 什么時候需要用SynchronizedSynchronized主要作用是在多個線程操作共享數(shù)據(jù)的時候,保證對共享數(shù)據(jù)訪問的線程安全性。比如兩個線程對于i這個共...

    everfly 評論0 收藏0

發(fā)表評論

0條評論

kamushin233

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<