[英]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.