Synchronized block - Java



我意识到Java中提供的同步块基本上是可重入互斥锁的实现。然而,同步块是原子的吗?

那么,当前在同步块中执行的线程的中断是如何处理的呢?是否通过恢复到目前为止所做的所有更改来简单地释放锁?

编辑:关于问题的中断部分-它在Java中通常是如何处理的。例如,我看到许多java代码示例,其中开发人员在线程处于等待队列中时捕获中断。然而,在catch块中,它们所做的只是打印中断已经被引发。我更好奇的是,这条线到底发生了什么?它从等待队列中删除了吗?

——atomicity

同步块有助于实现原子性——但是它们的数据操作不能保证是原子性的。为了使同步块中的东西原子化,您经常使用像getter和setter这样的原子数据结构,例如AtomicBoolean。最新的java版本支持大量的原子类,比如原子int数组。

——如何处理中断:

中断不是由同步显式处理的——同步块只保证在执行时,该块不能被另一个线程重新进入。

然而,同步块是原子的吗?

是的,一个同步块强制这个块和在同一个对象上同步的任何块都是原子的。

如何处理中断:

中断与Java中的同步完全不同。每个线程都有一个interruptedStatus标志,当您在线程上调用interrupt()时设置该标志。如果设置了中断标志,Thread.sleep()等方法会抛出InterruptedException,并停止它们的休眠。

注意,Thread.sleep()在睡眠期间不会放弃任何锁。与同步块相关联的锁只有在执行流出块时才会被释放。

所以基本上是由程序员来捕捉中断事件和如果它在同步块内,放弃锁?

你不需要处理锁。如JLS 14.18 中所写同步语句:

如果Block的执行正常完成,则锁为解锁,同步语句正常完成。如果块的执行由于任何原因突然完成,则锁被解锁,然后同步语句完成因为同样的原因。

最新更新