相互排斥 - 如何同步工作?

时间:2017-12-17 01:57:27

标签: java multithreading synchronized

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

  1. 在不使用synchronized的{​​{1}}上,线程状态是否设置为wait()

  2. BLOCKED& BLOCKED状态消耗CPU周期?

1 个答案:

答案 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多个周期开销(涉及操作系统等)。