Java 为什么这个柜台不是;线程安全“;
我试图弄明白为什么这不是“线程安全的”,我画的空白是公开的Java 为什么这个柜台不是;线程安全“;,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我试图弄明白为什么这不是“线程安全的”,我画的空白是公开的 public class Counter { private static int val = 0; public Counter() { } public static void set(int newVal) { val = newVal; } public static void decrement() { int tmp = val; try { Thread.sleep(100L
public class Counter {
private static int val = 0;
public Counter() {
}
public static void set(int newVal) {
val = newVal;
}
public static void decrement() {
int tmp = val;
try {
Thread.sleep(100L);
} catch (Exception var2) {
;
}
--tmp;
val = tmp;
}
public static boolean depleted() {
return val == 0;
}
}
是否因为制造了许多计数器,它将无法正常工作?例如,假设一组字符使用计数器进行移动。如果一个角色没有动作可以移动,那么一个新角色开始移动。实现计数器的所有字符是否都不允许计数器正常工作?它与线程安全有什么关系
是否因为制造了许多计数器,它将无法正常工作
不,这不是线程安全的含义
假设某个程序p
可以说是正确的,如果它总是满足一组条件C
。线程安全意味着如果程序P
在一个线程上是正确的,那么在多个线程上也是正确的。更详细的解释可以在维基百科上的文章中找到
在本例中,代码的设计意图是实现整个应用程序共享的单个计数器。如果这不是所需要的,那就是一个问题。但是,问题在于,根据隐含的要求(对于多个计数器),代码不正确,而不是线程安全
此代码存在线程安全问题。具体来说,如果两个或多个线程使用该类,那么代码将无法正常工作。。。作为单个共享计数器。例如,在线程上可能看不到另一个线程所做的更新,或者减量可能丢失。问题是线程在没有正确同步的情况下会使用共享变量(即
val
)。如果没有同步,那么您可能会遇到竞争条件和内存异常。您似乎不明白线程安全是什么。。。通读一遍,非常感谢。为了进一步理解,我尝试实现它,以了解如果两个线程使用它,那么它将无法正常工作。我可以做哪些简单的实现来查看它的运行情况,并证明它不是线程安全的?摆脱sleep
调用,然后编写一个多线程应用程序,从多个线程快速执行大量操作。。。并寻找反常的答案。如果出现异常,您(可能)已经证明它不是线程安全的。(但是如果你没有看到异常,你就没有证明代码是线程安全的!!)证明代码是线程安全的是很困难的。它需要对代码进行详细分析,并深入理解Java内存模型(JMM)。