ove*_*nge -3 java multithreading synchronized
如回答中所述,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周期?
通常不,至少不是持续的方式.进入和退出状态1有一个CPU成本,但是一旦线程被阻塞,它通常会保持在非可运行状态,直到它在监视器空闲时被唤醒,并且在此期间不使用CPU资源.
1这正是为什么好的实现通常会在进入睡眠状态之前"旋转"一下,以防关键部分很短并且保持线程可能很快退出 - 在这种情况下旋转避免了转换为睡眠的1000+周期开销(涉及操作系统等).
归档时间: |
|
查看次数: |
165 次 |
最近记录: |