同步块 - Java
我意识到在Java中提供的同步块基本上是一个可重入互斥体的实现。但是,同步块原子?同步块 - Java
那么如何处理当前在同步块内执行的线程的中断 - 是否通过恢复到目前为止所做的所有更改来释放锁?
编辑:至于问题的中断部分 - 它如何通常在Java中处理。例如,我看到很多java代码示例,其中开发人员在某个线程处于等待队列中时(例如)会捕获中断。但是,在catch块中,他们所做的只是打印中断。我对这个线程实际发生了什么感到好奇吗?它是否从等待队列中删除?
回答:
- 原子
synchronized块有助于实现原子 - 但他们的数据操作无法garaunteed是原子的。要使同步块中的内容成为原子,通常使用原子数据结构,如getter和setter,例如AtomicBoolean。
有一个伟大的原子类的聚宝盆,像原子诠释数组,由最新的Java版本支持。
- 处理中断的方式:
中断中未明确通过同步处理 - 同步块只有gaurantee,虽然执行时,该块不能由另一个线程重新输入。
回答:
然而,是同步块原子?
是的,一个同步块强制这个块和任何在同一个对象上同步的块都是原子的。
中断的处理方式:
中断是在Java同步完全不同。每个线程都有一个interruptedStatus
标志,只要您在线程上调用interrupt()
就会设置该标志。诸如Thread.sleep()
之类的方法如果设置了中断标志则会抛出InterruptedException并暂停其睡眠。
请注意,Thread.sleep()
不会在睡眠期间放弃任何锁定。与同步块关联的锁仅在执行流出块时才会释放。
回答:
因此,基本上它是一个程序员来捕捉中断事件,并且 放弃在同步块内部的情况下锁吗?
您不必处理锁定。由于写在JLS 14.18synchronized声明:
如果块的执行正常完成,那么锁是 解锁和同步语句正常完成。如果 由于任何原因突然完成,则 锁被解锁,同步语句突然完成 ,原因相同。
以上是 同步块 - Java 的全部内容, 来源链接: utcz.com/qa/262947.html