为什么心不是这个计数器类“线程安全的”
林试图找出为什么这个心不是“线程安全”和IM画坯公共为什么心不是这个计数器类“线程安全的”
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
对于一个线程是正确的,对于多个线程也是正确的。更详细的解释可以在*关于thread safety的文章中找到。
在此示例中,代码为,设计旨在实现将由整个应用程序共享的单个计数器。如果这不是需要的,那就是一个问题。但是,问题在于根据隐含的要求(对于多个计数器)代码不正确而不是线程安全。
此代码存在线程安全问题。特别是,如果两个或更多的线程使用这个类,那么代码将无法正常工作......作为一个单独的共享计数器。例如,在线程上可能看不到其他人所做的更新,或者递减可能会丢失。问题是线程将使用共享变量(即val
)而没有正确的同步。如果没有同步,那么你可以得到竞争条件和内存异常。
非常感谢。为了进一步的理解,即时通讯试图实现这个来看看如果两个线程使用这个,那么它将无法正常工作。我可以做些什么简单的实现来实现它,并证明它不是线程安全的? –
摆脱“睡眠”调用,然后编写一个多线程应用程序,它可以快速从多个线程中执行大量操作......并查找异常答案。如果你有异常(可能)证明它不是线程安全的。 (但是如果你没有看到异常,你没有证明代码是线程安全的!!) –
证明代码是线程安全的是很困难的。它需要对代码进行详细分析,并深入了解Java内存模型(JMM)。 –
您似乎无法理解线程安全是什么......请阅读*** [此处](https://en.wikipedia.org/wiki/Thread_safety)***。 – XenoRo