我试图弄清楚为什么这不是"线程安全"并且我正在绘制公共空白
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正常工作?它与线程安全有什么关系?
答案 0 :(得分:0)
是否因为如果制作了许多计数器,它将无法正常工作?
没有。这不是线程安全的意思。
如果总是满足一组条件P
,假设某个程序C
可以说正确。线程安全意味着如果程序P
对于一个线程是正确的,那么对于多个线程它也是正确的。更详细的解释可以在维基百科关于thread safety的文章中找到。
在此示例中,代码按设计旨在实现将由整个应用程序共享的单个计数器。如果那不是我们需要的,那就是一个问题。但问题是,根据隐含的要求(对于多个计数器),代码不正确,而不是线程安全。
此代码存在线程安全问题。具体来说,如果两个或多个线程使用此类,则代码将无法正常工作...作为单个共享计数器。例如,在线程上可能看不到另一个更新,或者可能丢失减量。问题是线程将使用共享变量(即val
)而没有适当的同步。如果没有同步,那么您可以获得竞争条件和内存异常。