多線程:synchronized 關(guān)鍵字用法(修飾類,方法,靜態(tài)方法,代碼塊)

synchronized用法

synchronized修飾的對(duì)象有幾種:

  • 修飾一個(gè)類:其作用的范圍是synchronized后面括號(hào)括起來(lái)的部分,作用的對(duì)象是這個(gè)類的所有對(duì)象;

  • 修飾一個(gè)方法:被修飾的方法稱為同步方法,其作用的范圍是整個(gè)方法,作用的對(duì)象是調(diào)用這個(gè)方法的對(duì)象

  • 修飾一個(gè)靜態(tài)的方法:其作用的范圍是整個(gè)方法,作用的對(duì)象是這個(gè)類的所有對(duì)象;

  • 修飾一個(gè)代碼塊:被修飾的代碼塊稱為同步語(yǔ)句塊,其作用范圍是大括號(hào){}括起來(lái)的代碼塊,作用的對(duì)象是調(diào)用這個(gè)代碼塊的對(duì)象;


修飾一個(gè)類

其作用的范圍是synchronized后面括號(hào)括起來(lái)的部分,作用的對(duì)象是這個(gè)類的所有對(duì)象,如下代碼:

class ClassName {
   public void method() {
      synchronized(ClassName.class) {
         // todo
      }
   }
}

修飾一個(gè)方法

synchronized 修飾一個(gè)方法很簡(jiǎn)單,就是在方法的前面加synchronized,例如:

public synchronized void method()
{
   // todo
}

另外,有幾點(diǎn)需要注意:

  • 在定義接口方法時(shí)不能使用synchronized關(guān)鍵字。

  • 構(gòu)造方法不能使用synchronized關(guān)鍵字,但可以使用synchronized代碼塊來(lái)進(jìn)行同步。

  • synchronized 關(guān)鍵字不能被繼承 。如果子類覆蓋了父類的 被 synchronized 關(guān)鍵字修飾的方法,那么子類的該方法只要沒(méi)有 synchronized 關(guān)鍵字,那么就默認(rèn)沒(méi)有同步,也就是說(shuō),不能繼承父類的 synchronized。


修飾靜態(tài)方法

我們知道 靜態(tài)方法是屬于類的而不屬于對(duì)象的 。同樣的, synchronized修飾的靜態(tài)方法鎖定的是這個(gè)類的所有對(duì)象 。如下:

public synchronized static void method() {
   // todo
}

修飾代碼塊

  • 當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。

  • 當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。

  • 尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。

  • 第三個(gè)例子同樣適用其它同步代碼塊。也就是說(shuō),當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問(wèn)都被暫時(shí)阻塞。

  • 以上規(guī)則對(duì)其它對(duì)象鎖同樣適用.


ps

修飾靜態(tài)方法其實(shí)是類鎖,區(qū)別于對(duì)象鎖。

public ClassA {
    public synchronized static void staticMethod() {
    // todo
}

public synchronized void method() {
    // todo
}

public void method2() {
synchronized(ClassA.class) {
            // todo
        }
    }
}

ClassA obj = new ClassA();

也就是說(shuō)ClassA.staticMethod() 和 obj.method() 并不會(huì)存在互斥關(guān)系,但是會(huì)和obj.method2()存在互斥關(guān)系。


pps

在平時(shí)多線程的使用中,特別是關(guān)于自己定義一些東西的遍歷和添加的時(shí)候,最好保證在遍歷的時(shí)候不要添加,在輸出數(shù)據(jù)的同時(shí)不要添加數(shù)據(jù),因?yàn)槎嗑€程機(jī)智,你無(wú)法控制輸出輸入在同一個(gè)線程的話,最好使用鎖機(jī)制,來(lái)避免一些錯(cuò)誤的產(chǎn)生。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 本人主要是結(jié)合《Java多線程編程核心技術(shù)》這本書(shū)的第二章內(nèi)容,對(duì)synchronized關(guān)鍵字的知識(shí)進(jìn)行梳...
    碼字與律動(dòng)閱讀 964評(píng)論 0 4
  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過(guò)程中...
    勝浩_ae28閱讀 5,267評(píng)論 0 23
  • 1、Synchronized關(guān)鍵字 1、方法中的變量不存在非線程安全問(wèn)題,都是線程安全的。 2、兩個(gè)線程訪問(wèn)同一個(gè)...
    AI喬治閱讀 1,597評(píng)論 1 7
  • 整理來(lái)自互聯(lián)網(wǎng) 1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工具...
    Ncompass閱讀 1,627評(píng)論 0 6
  • 一:java概述: 1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)...
    慕容小偉閱讀 1,959評(píng)論 0 10

友情鏈接更多精彩內(nèi)容