成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

java線程--最小同步鎖

kamushin233 / 1293人閱讀

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

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

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個(gè)線程,每個(gè)線程實(shí)例化一個(gè)Sync并調(diào)用其方法,所以這里synchronized沒有作用,因?yàn)榫€程都加了各自的同步鎖,無互斥。

若把test方法上加上static,則運(yùn)行結(jié)果如下:
test開始.. test結(jié)束.. test開始.. test結(jié)束.. test開始.. test結(jié)束
因?yàn)榇藭r(shí),3個(gè)線程的同步鎖是Sync類對(duì)象而不是類實(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時(shí),并不會(huì)釋放鎖.

接下來,把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é)束
同樣的道理,這里的同步鎖是自各的對(duì)象實(shí)例,3個(gè)線程互不影響,沒有互斥作用

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

上面使用static實(shí)現(xiàn)了線程互斥,其實(shí)也可以用同一個(gè)對(duì)象來實(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é)束
可以看到,線程同步互斥了

更好的做法是,直接鎖住這個(gè)對(duì)象的class對(duì)象,與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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/76983.html

相關(guān)文章

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

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

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

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

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

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

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

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

    JiaXinYi 評(píng)論0 收藏0
  • Synchronized原理分析

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

    everfly 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

kamushin233

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<