synchronized的4種用法

2021-08-28 10:07:45 字數 3399 閱讀 2807

synchronized的4種用法

1.方法宣告時使用,放在範圍操作符(public等)之後,返回型別宣告(void等)之前.即一次只能有乙個執行緒進入該方法,其他執行緒要想在此時呼叫該方法,只能排隊等候,當前執行緒(就是在synchronized方法內部的執行緒)執行完該方法後,別的執行緒才能進入.

例如:public synchronized void synmethod() {

//方法體

2.對某一**塊使用,synchronized後跟括號,括號裡是變數,這樣,一次只有乙個執行緒進入該**塊.例如:

public int synmethod(int a1){

synchronized(a1) {

//一次只能有乙個執行緒進入

3.synchronized後面括號裡是一物件,此時,執行緒獲得的是物件鎖.例如:

public class mythread implements runnable {

public static void main(string args) {

mythread mt = new mythread();

thread t1 = new thread(mt, "t1");

thread t2 = new thread(mt, "t2");

thread t3 = new thread(mt, "t3");

thread t4 = new thread(mt, "t4");

thread t5 = new thread(mt, "t5");

thread t6 = new thread(mt, "t6");

t1.start();

t2.start();

t3.start();

t4.start();

t5.start();

t6.start();

public void run() {

synchronized (this) {

system.out.println(thread.currentthread().getname());

對於3,如果執行緒進入,則得到物件鎖,那麼別的執行緒在該類所有物件上的任何操作都不能進行.在物件級使用鎖通常是一種比較粗糙的方法。為什麼要將整個物件都上鎖,而不允許其他執行緒短暫地使用物件中其他同步方法來訪問共享資源?如果乙個物件擁有多個資源,就不需要只為了讓乙個執行緒使用其中一部分資源,就將所有執行緒都鎖在外面。由於每個物件都有鎖,可以如下所示使用虛擬物件來上鎖:

class finegrainlock {

mymemberclass x, y;

object xlock = new object(), ylock = new object();

public void foo() {

synchronized(xlock) {

//access x here

//do something here - but don't use shared resources

synchronized(ylock) {

//access y here

public void bar() {

synchronized(this) {

//access both x and y here

//do something here - but don't use shared resources

4.synchronized後面括號裡是類.例如:

class arraywithlockorder{

private static long num_locks = 0;

private long lock_order;

private int arr;

public arraywithlockorder(int a)

arr = a;

synchronized(arraywithlockorder.class) {//-----------------------------------------這裡

num_locks++;             // 鎖數加 1。

lock_order = num_locks;  // 為此物件例項設定唯一的 lock_order。

public long lockorder()

return lock_order;

public int array()

return arr;

class someclass implements runnable

public int sumarrays(arraywithlockorder a1,

arraywithlockorder a2)

int value = 0;

arraywithlockorder first = a1;       // 保留陣列引用的乙個

arraywithlockorder last = a2;        // 本地副本。

int size = a1.array().length;

if (size == a2.array().length)

if (a1.lockorder() > a2.lockorder())  // 確定並設定物件的鎖定

{                                     // 順序。

first = a2;

last = a1;

synchronized(first) {              // 按正確的順序鎖定物件。

synchronized(last) {

int arr1 = a1.array();

int arr2 = a2.array();

for (int i=0; ivalue += arr1[i] + arr2[i];

return value;

public void run() {

對於4,如果執行緒進入,則執行緒在該類中所有操作不能進行,包括靜態變數和靜態方法,實際上,對於含有靜態方法和靜態變數的**塊的同步,我們通常用4來加鎖.

以上4種之間的關係:

鎖是和物件相關聯的,每個物件有一把鎖,為了執行synchronized語句,執行緒必須能夠獲得synchronized語句中表示式指定的物件的鎖,乙個物件只有一把鎖,被乙個執行緒獲得之後它就不再擁有這把鎖,執行緒在執行完synchronized語句後,將獲得鎖交還給物件。

在方法前面加上synchronized修飾符即可以將乙個方法宣告為同步化方法。同步化方法在執行之前獲得乙個鎖。如果這是乙個類方法,那麼獲得的鎖是和宣告方法的類相關的class類物件的鎖。如果這是乙個例項方法,那麼此鎖是this物件的鎖。

synchronized的4種用法

synchronized的4種用法

1.方法宣告時使用,放在範圍操作符 public等 之後,返回型別宣告 void等 之前.即一次只能有乙個執行緒進入該方法,其他執行緒要想在此時呼叫該方法,只能排隊等候,當前執行緒 就是在synchronized方法內部的執行緒 執行完該方法後,別的執行緒才能進入.例如 public synchro...

synchronized的四種用法

一 修飾方法 synchronized修飾乙個方法很簡單,就是在方法的前面加synchronized,synchronized修飾方法和修飾乙個 塊類似,只是作用範圍不一樣,修飾 塊是大括號括起來的範圍,而修飾方法範圍是整個函式。例如 方法一 public synchronized void met...

Synchronized的兩種用法

1.物件鎖 public class demo3 implements runnable system.out.println finished override public void run public synchronized void method catch interruptedexc...