多執行緒的入門學習之三

2021-09-26 10:40:12 字數 2107 閱讀 7313

常用方法:

synchronized關鍵字:

public synchronized void methodaaa()

2)作用整個類的所有例項:*synchronized static astaticmethod{}*防止多個執行緒同時訪問這個類中的synchronized static 方法。它可以對類的所有物件例項起作用。
class foo

public void methodbbb()

}

**中的methodbbb()方法是把class literal作為鎖的情況,它和同步的static函式產生的效果是一樣的,取得的鎖很特別,是當前呼叫這個方法的物件所屬的類(class,而不再是由這個class產生的某個具體物件了)。

public void methodaaa()

}

this指的是呼叫這個方法的物件。

public void method3(someobject so)

}

鎖就是so這個物件,誰拿到這個鎖誰就可以執行它所控制的那段**。當有乙個明確的物件作為鎖時,就可以這樣寫程式,但當沒有明確的物件作為鎖,只是想讓一段**同步時,可以建立乙個特殊的instance變數(它得是乙個物件)來充當鎖:

class foo implements runnable

}}

注:零長度的byte陣列物件建立起來將比任何物件都經濟――檢視編譯後的位元組碼:生成零長度的byte物件只需3條操作碼,而object lock = new object()則需要7行操作碼。

總結:

a.無論synchronized關鍵字加在方法上還是物件上,它取得的鎖都是物件,而不是把一段**或函式當作鎖――而且同步方法很可能還會被其他執行緒的物件訪問。

b.每個物件只有乙個鎖(lock)與之相關聯。

c.實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。

d. synchronized關鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中並不自動是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個方法為synchronized方法;

lock的使用:

public inte***ce lock
鎖的應用:

/**

* 描述:lock使用

*/public class lockdemo

class consumer extends thread

volatile boolean flag=true;

private void consume() catch (interruptedexception e)

}queue.poll(); //每次移走隊首元素

notfull.signal();

system.out.println("從佇列取走乙個元素,佇列剩餘"+queue.size()+"個元素");

} finally}}

}class producer extends thread

volatile boolean flag=true;

private void produce() catch (interruptedexception e)

}queue.offer(1); //每次插入乙個元素

notempty.signal();

system.out.println("向佇列取中插入乙個元素,佇列剩餘空間:"+(queuesize-queue.size()));

} finally}}

}}

我的理解是:其實就和wait,notify差不多,只不過condition內部維護了乙個佇列,wait後的執行緒有序進入該佇列等待,然後signal喚醒就是按佇列順序,先來先喚醒,區別於notify的隨機喚醒。

詳細請參考:說的很詳細,也可以看懂

多執行緒程式設計之三

多執行緒程式設計之三 執行緒間通訊韓耀旭 七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將...

多執行緒學習(三)

1.程序有狀態,單執行緒程序的狀態與主線程的狀態同義 2.如果主線程掛起,則程序掛起 3.單如果程序擁有多個執行緒,則所有執行緒阻塞,只有乙個啟用,則是啟用。讓程序掛起,則所有執行緒掛起 執行緒的實現模型 使用者執行緒,核心級執行緒,混合執行緒 核心執行緒由作業系統管理,程序可以有多個執行緒 pos...

多執行緒程式設計之三 執行緒間通訊

多執行緒程式設計之三 執行緒間通訊 七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說...