在与中断线程的关系之前,是否在线程上调用interrupt()

换句话说,我想知道在中断线程中检测到中断时,在中断之前更改变量是否始终可见。 例如

private int sharedVariable; public static void interruptTest() { Thread someThread = new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { // Is it here guaranteed that changes before interrupt are always visible here? System.out.println(sharedVariable); } }); someThread.start(); Thread.sleep(1000); sharedVariable = 10; someThread.interrupt(); } 

我试图在Java语言规范和Java教程 中提到的java.util.concurrent包的Summary页面中找到答案,但没有提到interrupt

我知道volatile和其他同步原语但我需要它们吗?

是的,从线程T1中断线程T2 在T1和T2之间创建一个先发生的关系,如JLS 17.4.4中所述。 同步顺序

如果线程T1中断线程T2,则T1的中断与任何其他线程(包括T2)确定T2已被中断的任何点同步(通过抛出InterruptedException或通过调用Thread.interrupted或Thread.isInterrupted)。

现在这只暗示T1 中断T2的检测同步 ,而你问及之前发生的事情 。 幸运的是前者暗示后者从17.4.5开始。 发生在订单之前

可以通过先发生关系来排序两个动作。 如果一个动作发生在另一个动作之前,那么第一个动作在第二个动作之前是可见的并且在第

如果我们有两个动作x和y,我们写hb(x,y)来表示x发生在y之前。

  • 如果动作x与后续动作y同步,那么我们也有hb(x,y)。

因此,您可以安全地访问sharedVariable因为它知道它具有(至少)T1写入的值,即使没有volatile