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