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 此處列舉的是不同例項呼叫的情況 此處列舉的是同一例項呼叫的情況 ...