相互排斥 - 如何同步工作? [关闭]

问题描述 投票:-3回答:1

正如answer中所提到的,synchronized是使用compareAndSwap实现的,这是一种非阻塞算法。

  1. 在没有使用synchronizedwait()上,线程状态是否设置为BLOCKED
  2. BLOCKEDWAITING状态中的线程是否消耗CPU周期?
java multithreading synchronized
1个回答
5
投票

如回答中所述,synchronized是使用compareAndSwap实现的,compareAndSwap是非阻塞算法。

我想你误解了这个答案。 synchronized肯定没有用Java级别的compareAndSwap调用实现。它将由JVM中的解释器和JIT以本机代码实现。在封面下它可能使用比较和交换指令,或者它可能使用其他东西(原子测试和设置和原子交换也很常见 - 有些平台甚至没有CAS原语)。

这绝对不是一个“非阻塞算法” - 根据定义,synchronized实现了一种关键部分,如果第二个线程试图进入临界区而另一个线程在其中,则意味着阻塞。

1)在不使用wait()的情况下同步,线程状态是否设置为BLOCKED?

是的,如果线程正在等待进入synchronized部分,则其状态设置为BLOCKED

2)处于BLOCKED和WAITING状态的线程是否消耗CPU周期?

通常不,至少不是持续的方式。进入和退出state1有一个CPU成本,但是一旦线程被阻塞,它通常会保持在不可运行的状态,直到它在监视器空闲时被唤醒,并且在此期间不使用CPU资源。


1这正是为什么好的实现通常会在进入睡眠状态之前“旋转”一下,以防关键部分很短并且保持线程可能很快退出 - 在这种情况下旋转避免了转换为睡眠的1000+周期开销(涉及操作系统等)。

© www.soinside.com 2019 - 2024. All rights reserved.