无限循环内的同步块

时间:2014-06-18 12:31:10

标签: java multithreading concurrency

我有两个主题,比如 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 现在可以自由获取锁定:!condition不符合,因此它不会进入内部while循环,它会执行其他操作然后再执行致电obj.notify() 我期待的是: T1 醒来,获得锁等等,但我看到的大部分时间是 T1 无法获取锁定因此 T2 再次执行。

我问你这个行为是由while(true)循环引起的,还是其他什么。

1 个答案:

答案 0 :(得分:6)

在线程中没有任何保证。一个或另一个线程将首先命中同步块,你永远不应指望任何一种行为。

实际上,当前运行的线程没有“启动”成本,因此更有可能首先命中同步块。

这里的关键是不要担心哪个线程正在做什么,而是专注于减少争用。从同步块中获取尽可能多的处理,并评估是否确实需要同步所有内容,或者是否只能同步一小部分工作,或者要锁定多个不同的对象。