为什么心不是这个计数器类“线程安全的”

问题描述:

林试图找出为什么这个心不是“线程安全”和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; 
} 
} 

是因为如果很多柜台都兑现了,将无法正常工作?举例来说,使用计数器进行移动的一群人物。如果一个角色没有移动,那么新角色开始移动。执行计数器的所有字符是否都不允许计数器正常工作?它与线程安全有什么关系?

+1

您似乎无法理解线程安全是什么......请阅读*** [此处](https://en.wikipedia.org/wiki/Thread_safety)***。 – XenoRo

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

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

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

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

此代码存在线程安全问题。特别是,如果两个或更多的线程使用这个类,那么代码将无法正常工作......作为一个单独的共享计数器。例如,在线程上可能看不到其他人所做的更新,或者递减可能会丢失。问题是线程将使用共享变量(即val)而没有正确的同步。如果没有同步,那么你可以得到竞争条件内存异常

+0

非常感谢。为了进一步的理解,即时通讯试图实现这个来看看如果两个线程使用这个,那么它将无法正常工作。我可以做些什么简单的实现来实现它,并证明它不是线程安全的? –

+0

摆脱“睡眠”调用,然后编写一个多线程应用程序,它可以快速从多个线程中执行大量操作......并查找异常答案。如果你有异常(可能)证明它不是线程安全的。 (但是如果你没有看到异常,你没有证明代码是线程安全的!!) –

+1

证明代码是线程安全的是很困难的。它需要对代码进行详细分析,并深入了解Java内存模型(JMM)。 –