簡體   English   中英

無限循環內的同步塊

[英]synchronized block inside infinite loop

我有兩個線程,比如T1T2 ,它們同時對同一個對象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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM