java - 原子性真的是不可中断的还是几乎不可中断的?

标签 java multithreading atomic

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

public synchronized void increase() {
    count++;
}

两个线程(T_1T_2)都执行此方法。我们知道count++是一个由readmodifywrite组成的复合操作。如果T_1先拿到锁,执行read,此时是否可以中断T_1(虽然T_2可以'除了等待锁被释放之外,不需要做任何事情)?

来自Concurrency in Go by Katherine Cox-Buday ,它说:

When something is considered atomic, or to have the property of atomicity, this means that within the context that it is operating, it is indivisible, or uninterruptible.

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

但是从一个答案来看java - What does "atomic" mean in programming? - Stack Overflow ,它说:

"Atomic operation" means an operation that appears to be instantaneous from the perspective of all other threads. You don't need to worry about a partly complete operation when the guarantee applies.

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

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

最佳答案

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

关于java - 原子性真的是不可中断的还是几乎不可中断的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59402376/

相关文章:

java - 使用自动播放在 Android webview 中嵌入 YouTube 视频

java - 如何在单击时动态地将 swing 组件添加到 gui 并使其永久化

java - 使用 spring BeanUtils 复制特定属性

c++ - 我的线程运行不正常,它给出了所有结果,最后不是一个一个地在一起,并且 GUI 在线程运行期间被挂起了吗?

c# - 为什么没有接受 Doubles 作为参数的 Interlocked.Add 重载?

java - 包 org.jetbrains.annotations 不存在

Java Callable 线程 Swing gui

带有 Docker 的 Python Luigi - 线程/信号问题

c++ - std::atomic_bool 标志的内存顺序

java - 如何在 Java 中编写自定义原子方法?