Java 原子性是真正不可中断的还是实际上不可中断的?

Java 原子性是真正不可中断的还是实际上不可中断的?,java,multithreading,atomicity,Java,Multithreading,Atomicity,例如,我有一个名为increase的方法 公共同步作废增加(){ 计数++; } 两个线程(T_1和T_2)都执行此方法。我们知道,count++是一个复合操作,由read、modify和write组成。如果T_1首先获得锁,执行read,T_1是否可以在此时中断(尽管T_2除了等待锁释放之外,什么都不能做) 它说: 当某物被认为是原子的,或者具有原子性的属性时,这意味着在它运行的上下文中,它是不可分割的,或者是不可中断的 我认为这意味着原子性是真正不可中断的 但从一个答案到另一个答案,它说:

例如,我有一个名为
increase
的方法

公共同步作废增加(){
计数++;
}
两个线程(
T_1
T_2
)都执行此方法。我们知道,
count++
是一个复合操作,由
read
modify
write
组成。如果
T_1
首先获得锁,执行
read
T_1
是否可以在此时中断(尽管
T_2
除了等待锁释放之外,什么都不能做)

它说:

当某物被认为是原子的,或者具有原子性的属性时,这意味着在它运行的上下文中,它是不可分割的,或者是不可中断的

我认为这意味着原子性是真正不可中断的

但从一个答案到另一个答案,它说:

“原子操作”是指从所有其他线程的角度来看似乎是瞬时的操作。当担保生效时,您不必担心部分完成的操作

我认为这意味着原子性实际上是不可中断的(它可以被中断,但从所有其他线程的角度来看,它似乎不能被中断)


那么,哪一个是正确的呢?

A有人指出,现在您的程序有办法理解这种差异。但操作系统级的线程调度程序可以自由挂起一个线程并恢复另一个线程。
例如,如果在
synchronized
方法中,您正在执行一些阻塞I/O(如读取用户输入或从套接字读取),调度程序可以检测到它并暂停持有锁但在I/O上被阻塞的线程,并尝试恢复任何其他线程(甚至可能是正在等待相同锁的线程)

这两种情况都有可能,但第二种情况无论如何都是唯一正确的。@LouisWasserman那么,在哪种情况下,它才是真正不可中断的呢?在哪种情况下,它实际上是不可中断的?@LouisWasserman你说“第二个是唯一正确的,不管怎样”,你的意思是“从所有其他线程的角度来看,它似乎不能被中断”总是正确的吗?是的。对于原子操作来说,第二个版本总是正确的。为什么你认为两者之间有区别?或者,换一种方式问:如果你不能观察到中断,那么你怎么知道中断发生了?如果你不知道中断是否发生过,那么虚拟的和真正的不间断之间有什么区别吗?