我正在读一本叫做《 Java并发实践》的书,在第一章中,以下代码被证明是线程不安全的
public class UnsafeSequence {
private int value;
/** Returns a unique value. */
public int getNext() {
return value++;
}
}
因此,如果两个线程运行此代码,我们将得到不想要的结果,因为它们将在不同的步骤(例如读取,修改和写入值)中互换。这是仅由OS确定的,还是线程在不同的“字节码命令”之间进行切换?有没有办法知道线程可能从一个切换到另一个的所有可能的位置,而不仅仅是针对此代码,而且总的来说?
答案 0 :(得分:0)
如几条评论所述,不。您可以做两件事:
以线程安全的方式编写您的类,因此线程调度不会成为问题。
使用并发支持来防止问题。
继续读书。
答案 1 :(得分:0)
有没有办法知道线程可能从一个切换到另一个的所有可能位置,而不仅是针对此代码,而且一般而言?
这个问题有点奇怪。让我分为两部分:
两个线程可以在同一段代码上徘徊并愉快地交织,除了:
线程可以一直切换,这取决于操作系统。从理论上讲,如果操作系统决定,线程甚至可能永远不会有再次被“调度”的机会。线程可能会虚假地死掉(例如在ProcessExplorer中被杀死)。您永远不会知道线程何时会在其轨道中停止(挂起),但是您确实知道,如果该线程发生在原子操作内,那么在挂起的线程继续执行并完成操作之前,没有其他线程会输入该代码。
答案 2 :(得分:0)
只要系统调度程序有这种感觉,它就会发生。如果JVM仅将该调度传递给本机处理器,则与JVM无关。