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

ove*_*nge -3 java multithreading synchronized

回答中所述,synchronized使用compareAndSwap实现,这是非阻塞算法.

  1. synchronized不使用的情况下wait(),线程状态是否设置为BLOCKED

  2. 线程处于BLOCKED&WAITING状态是否消耗CPU周期?

Bee*_*ope 5

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

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

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

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

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

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

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


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

  • @overexchange那不是彼得所说的,你省略了"......还有更多".同步是*不*忙碌循环. (2认同)
  • @overexchange"CAS"不是"旋转循环".CAS只是一个可用于执行比较和交换操作的硬件指令.当然,您可以_用它来实现spin-loop_.`synchronized`肯定没有实现**只是**一个CAS旋转循环.将会有初始CAS尝试获取锁定,如果失败,它可能会旋转一定数量的迭代(可能基于该监视器的过去行为而自适应),如果在此期间未获得锁定,它将会在锁定可用之前使其自身不可运行,此时它将停止使用CPU. (2认同)
  • @overexchange - 如果你有一个像这样的全新问题,请创建一个单独的问答,不要使用评论.简单的回答是`notify()`和`wait()`为java程序提供了额外的有用语义(类似于条件变量在POSIX系统上提供的) - 这就是为什么与Java对象相关的"锁定"被称为_monitor_而不仅仅是一个简单的"关键部分".这些调用的语义与普通的临界区使用完全不同.我不确定为什么你会认为它们是用不同的底层操作系统原语实现的. (2认同)