正如answer中所提到的,synchronized
是使用compareAndSwap实现的,这是一种非阻塞算法。
synchronized
的wait()
上,线程状态是否设置为BLOCKED
?BLOCKED
和WAITING
状态中的线程是否消耗CPU周期?如回答中所述,synchronized是使用compareAndSwap实现的,compareAndSwap是非阻塞算法。
我想你误解了这个答案。 synchronized
肯定没有用Java级别的compareAndSwap
调用实现。它将由JVM中的解释器和JIT以本机代码实现。在封面下它可能使用比较和交换指令,或者它可能使用其他东西(原子测试和设置和原子交换也很常见 - 有些平台甚至没有CAS原语)。
这绝对不是一个“非阻塞算法” - 根据定义,synchronized
实现了一种关键部分,如果第二个线程试图进入临界区而另一个线程在其中,则意味着阻塞。
1)在不使用wait()的情况下同步,线程状态是否设置为BLOCKED?
是的,如果线程正在等待进入synchronized
部分,则其状态设置为BLOCKED
。
2)处于BLOCKED和WAITING状态的线程是否消耗CPU周期?
通常不,至少不是持续的方式。进入和退出state1有一个CPU成本,但是一旦线程被阻塞,它通常会保持在不可运行的状态,直到它在监视器空闲时被唤醒,并且在此期间不使用CPU资源。
1这正是为什么好的实现通常会在进入睡眠状态之前“旋转”一下,以防关键部分很短并且保持线程可能很快退出 - 在这种情况下旋转避免了转换为睡眠的1000+周期开销(涉及操作系统等)。