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)。