2011-10-06 90 views
7

我意识到在Java中提供的同步块基本上是一个可重入互斥体的实现。但是,同步块原子?同步块 - Java

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

编辑:至于问题的中断部分 - 它如何通常在Java中处理。例如,我看到很多java代码示例,其中开发人员在某个线程处于等待队列中时(例如)会捕获中断。但是,在catch块中,他们所做的只是打印中断。我对这个线程实际发生了什么感到好奇吗?它是否从等待队列中删除?

回答

4

- 原子

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

有一个伟大的原子类的聚宝盆,像原子诠释数组,由最新的Java版本支持。

- 处理中断的方式:

中断中未明确通过同步处理 - 同步块只有gaurantee,虽然执行时,该块不能由另一个线程重新输入。

2

然而,是同步块原子?

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

中断的处理方式:

中断是在Java同步完全不同。每个线程都有一个interruptedStatus标志,只要您在线程上调用interrupt()就会设置该标志。诸如Thread.sleep()之类的方法如果设置了中断标志则会抛出InterruptedException并暂停其睡眠。

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

+0

因此,基本上它是一个程序员捕获中断事件,并放弃锁的情况下,它的内部同步块? – Hari

+0

@Titan synchronized块更像是一个作用域锁,因此放弃该锁只需通过离开该作用域即可完成。请注意,中断事件仅仅是低级别线程控制的机制 - 尽管它们可能在相似的时间使用,但它们是正交的概念。 – Bringer128

1

因此,基本上它是一个程序员来捕捉中断事件,并且 放弃在同步块内部的情况下锁吗?

您不必处理锁定。由于写在JLS 14.18synchronized声明

如果块的执行正常完成,那么锁是 解锁和同步语句正常完成。如果 由于任何原因突然完成,则 锁被解锁,同步语句突然完成 ,原因相同。