gpt4 book ai didi

java - 离开同步块(synchronized block)时自动notify()/notifyAll()

转载 作者:行者123 更新时间:2023-12-01 07:32:56 25 4
gpt4 key购买 nike

我一直在考虑向 Java 语言架构师发送一份提案。

在同步块(synchronized block)中

synchronized(lock) {

// If there is no notification before this point
// <--- implicitly put here // lock.notifyAll(); // OR // lock.notify();
}

线程离开同步块(synchronized block)后,它不能再调用lock.notifyAll()/lock.notify()而不会出现异常。

忘记通知其他线程监视器持有者可能会永远让他们(其他线程)等待(除非他们在等待方法中设置了一些超时)。

synchronized(lock) {

lock.wait(); //<--- this thread may forever freeze here
}

我无法想象这种行为(在没有显式通知时在同步块(synchronized block)末尾插入隐式通知)是不受欢迎的情况。

相同的方法可以应用于同步方法。

<小时/>

可以通过不同的方式(技术上)实现此类行为,例如:

@autonotify
synchronized(lock) {
...
}

@autonotify
public void synchronized doSomething() {
...
}

或者:

@autonotifyAll
synchronized(lock) {
...
}

@autonotifyAll
public void synchronized doSomething() {
...
}

或者 - 将自动通知设置为默认行为,但保留抑制它的能力,例如:

@suppressautonotify
synchronized(lock) {
...
}

@suppressautonotifyAll
public void synchronized doSomething() {
...
}
<小时/>

你觉得怎么样?反对?

支持或反对该提案的最佳评论将被接受作为答案。

最佳答案

自动或默认执行此操作是一个很大的禁忌。在许多情况下,您在锁上进行同步而不希望在同步块(synchronized block)末尾发出通知。这样做会破坏大量现有程序。

为什么要使用 @autonotifyAll 来实现,而不是在同步块(synchronized block)末尾使用简单的 lock.notifyAll() 来实现。如果您忘记调用lock.notifyAll(),您也有很多机会忘记@autonotifyAll。而且它会降低内容的可读性和一致性。

无论如何,最佳实践是避免使用这些非常低级的方法,而使用更高级别的抽象,例如阻塞队列、倒计时锁存器、信号量等。

如果我必须做出决定,你的建议将被拒绝。

关于java - 离开同步块(synchronized block)时自动notify()/notifyAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15886972/

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