[英]synchronized block inside infinite loop
我有兩個線程,比如T1和T2 ,它們同時對同一個對象obj :
class T1 extends Thread {
public void run() {
while(true) {
synchronized(obj) {
while(condition) {
...do something...
obj.wait();
}
...do something else...
obj.notify();
}
}
}
}
class T2 extends Thread {
public void run() {
while(true) {
synchronized(obj) {
while(!condition) {
...do something...
obj.wait();
}
...do something else...
obj.notify();
}
}
}
}
所以,假設T1首先獲得鎖定,進入while(condition)
循環並暫停自己。 另一方面, T2現在可以自由獲取lock obj.notify()
!condition
不滿足因此它不會進入內部while
循環,它會執行其他操作然后調用obj.notify()
。
我期待的是: T1喚醒,獲取鎖定等等,但我看到的大部分時間是T1無法獲取鎖定因此T2再次執行。
我問你這個行為是由while(true)
循環引起的,還是其他什么。
在線程中沒有任何保證。 一個或另一個線程將首先命中同步塊,您永遠不應指望任何一種行為。
實際上,當前運行的線程沒有“啟動”成本,因此更有可能首先命中同步塊。
這里的關鍵是不要擔心哪個線程正在做什么,而是專注於減少爭用。 從同步塊中獲取盡可能多的處理,並評估是否確實需要同步所有內容,或者是否只能同步一小部分工作,或者要鎖定多個不同的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.