为什么这个反班级"线程安全"

时间:2017-10-22 04:04:47

标签: 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);
    } catch (Exception var2) {
        ;
    }

    --tmp;
    val = tmp;
}

public static boolean depleted() {
    return val == 0;
}
}

是否因为如果制作了许多计数器,它将无法正常工作?例如,使用Counter进行移动的一堆字符。如果角色没有移动,那么新角色就会开始移动。是否所有实现Counter的字符都不允许Counter正常工作?它与线程安全有什么关系?

1 个答案:

答案 0 :(得分:0)

  

是否因为如果制作了许多计数器,它将无法正常工作?

没有。这不是线程安全的意思。

如果总是满足一组条件P,假设某个程序C可以说正确。线程安全意味着如果程序P对于一个线程是正确的,那么对于多个线程它也是正确的。更详细的解释可以在维基百科关于thread safety的文章中找到。

在此示例中,代码按设计旨在实现将由整个应用程序共享的单个计数器。如果那不是我们需要的,那就是一个问题。但问题是,根据隐含的要求(对于多个计数器),代码不正确,而不是线程安全。

此代码存在线程安全问题。具体来说,如果两个或多个线程使用此类,则代码将无法正常工作...作为单个共享计数器。例如,在线程上可能看不到另一个更新,或者可能丢失减量。问题是线程将使用共享变量(即val)而没有适当的同步。如果没有同步,那么您可以获得竞争条件内存异常