gpt4 book ai didi

java - 仅当线程实际上已挂起时才进入同步块(synchronized block)的代码是否是双重检查锁定的示例?

转载 作者:搜寻专家 更新时间:2023-11-01 02:31:20 24 4
gpt4 key购买 nike

如果我没记错的话,Java 线程中有一个 Sin,称为双重检查锁定。

这已经有一段时间了,但它有点像检查一个值,如果它是 true,则进入一个 synchronized block 并再次检查它。因为已经有一段时间了,我不记得为什么它有确切的缺陷。我记得它与 Java 规范有关,允许实现以某种方式重新排序各种语句的执行(并且因为大多数情况下它通常不起作用)。(它的优势是最大限度地减少了进入 synchronized block 的过程,这很慢。)

我正在查看:http://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html并遇到:

A simple trick can be used to remove the synchronization that we've added to each iteration of the "run loop." The synchronized block that was added is replaced by a slightly more complex piece of code that enters a synchronized block only if the thread has actually been suspended:

        if (threadSuspended) {
synchronized(this) {
while (threadSuspended)
wait();
}
}

感觉有点像双重检查锁定,但我觉得 imp prob 是错误的,因为它来自官方文档。

此外,它是一个 while 循环这一事实似乎有点不对劲。那么该代码是邪恶的吗?还是不行?

最佳答案

threadSuspended 变量上使用 volatile 关键字会给您带来所需的效果。问题在于,当多个线程访问同一个变量时,可能存在变量的线程局部缓存。 volatile 关键字确保不会发生这种缓存。

Here是进一步解释的帖子。

编辑:

关于 while,由于代码的目的是等待线程不再挂起,我认为没有理由不使用 while

此外,如评论中所述,您粘贴的代码段下方的行提到了 volatile,下面几行的完整代码段将 threadSuspended 声明为 volatile boolean 值

关于java - 仅当线程实际上已挂起时才进入同步块(synchronized block)的代码是否是双重检查锁定的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8578586/

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