同步块 - Java

时间:2011-10-06 01:11:32

标签: java multithreading mutex

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

那么如何处理当前在synchronized块中执行的线程的中断 - 它是否只是通过还原到目前为止所做的所有更改来释放锁定?

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

3 个答案:

答案 0 :(得分:4)

- 原子性

同步块有助于实现原子性 - 但是他们的数据操作无法成为原子的。要使同步块中的内容成为原子,您经常使用原子数据结构,如getter和setter,例如AtomicBoolean。

最新的java版本支持巨大的原子类,如原子int数组。

- 如何处理中断:

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

答案 1 :(得分:2)

  

然而,synchronized块是原子?

是的,同步块强制执行此块以及在同一个Object上同步的任何块都是原子的。

  

如何处理中断:

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

请注意Thread.sleep()在睡眠期间不会放弃任何锁定。与同步块关联的锁仅在执行流出块时释放。

答案 2 :(得分:1)

  

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

您无需处理锁定。如JLS 14.18 同步语句

中所述
  

如果块的执行正常完成,则锁定为   解锁并且synchronized语句正常完成。如果   Block的执行因任何原因突然完成,然后是   锁解锁,然后synchronized语句完成   突然出于同样的原因。