gpt4 book ai didi

java - 无限循环内的同步块(synchronized block)

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:08 24 4
gpt4 key购买 nike

我有两个线程,比如 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 现在可以自由获取锁:!condition 不满足,因此它不会进入内部 while 循环,它做其他事情然后调用 obj.notify()
我期待的是:T1 醒来,获取锁等等,但大多数时候我看到的是 T1 无法获取锁,因此T2 再次执行。

我想问您,此行为是由 while(true) 循环引起的,还是其他原因引起的。

最佳答案

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

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

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

关于java - 无限循环内的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24285682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com