synchronized 加鎖保證執行緒安全

2021-08-25 02:55:47 字數 1170 閱讀 3824

synchronized關鍵字最主要有以下3種應用方式:

1 例項方法加鎖 (非靜態方法)

使用synchronized修飾,以便保證執行緒安全:加了synchronized 後同時只能有乙個執行緒訪問該方法。

但如果多個例項物件操作,非靜態方法不能保證執行緒安全。

public class accountingsync implements runnable

@override

public void run()

}public static void main(string args) throws interruptedexception

/*** 輸出結果:

* 2000000

*/}

2.靜態方法加鎖

當synchronized作用於靜態方法時,其鎖就是當前類的class物件鎖。當多個不同物件例項同時訪問時也能保證執行緒安全(無論例項多少個物件,靜態方法是屬於類本身的,只能同時被乙個物件訪問)。

由於靜態成員不專屬於任何乙個例項物件,是類成員。給靜態方法加鎖可以保證執行緒安全。

3.synchronized鎖定**塊

public class accountingsync implements runnable}}

public static void main(string args) throws interruptedexception

}

將synchronized作用於乙個給定的例項物件instance,即當前例項物件就是鎖物件,每次當執行緒進入synchronized包裹的**塊時就會要求當前執行緒持有instance例項物件鎖,如果當前有其他執行緒正持有該物件鎖,那麼新到的執行緒就必須等待,這樣也就保證了每次只有乙個執行緒執行i++;操作。當然除了instance作為物件外,我們還可以使用this物件(代表當前例項)或者當前類的class物件作為鎖,如下**:

//this,當前例項物件鎖

synchronized(this)}​

//class物件鎖

synchronized(accountingsync.class)

}

synchronized加鎖過程

保證執行緒同步的方法 執行緒通訊的方法 wait notify synchronized,reentranklock,我所認為的認為的synchronized,鎖的膨脹過程,這是乙個怎樣的概念 無鎖狀態 偏向鎖 輕量級鎖 重量級鎖 首先來說說為什麼是這樣設定 我所認為的 首先來說說物件頭吧,其實我只...

synchronized的幾種加鎖方式

public class synchronizedtest catch interruptedexception e public static void main string args start new thread start 此處列舉的是不同例項呼叫的情況 此處列舉的是同一例項呼叫的情況 ...

synchronized的幾種加鎖方式

public class synchronizedtest catch interruptedexception e public static void main string args start new thread start 此處列舉的是不同例項呼叫的情況 此處列舉的是同一例項呼叫的情況 ...