我有一个计数器,并且多个线程访问 getCount
方法。代码如下:
public class ThreadSafeMethod {
public static int counter = 0;
public static int getCount() {
return counter++;
}
}
该方法线程安全吗?我的理解是,因为 counter++
不是原子的,所以它不安全。那么如何保证安全呢?如果我们添加 synchronized
关键字,什么对象会被同步?
最佳答案
当您说它不是线程安全的,因为操作不是原子的时,您的分析是正确的。值的检索和增量不是线程安全的。多次调用此方法(无论是否有参数)访问同一个非局部变量。
向此方法添加 synchronized
使其成为线程安全的。当添加到static
方法时,Class
对象就是被锁定的对象。
使其成为线程安全的另一种方法是将 int
替换为 AtomicInteger
,它有自己的原子 getAndIncrement
方法。
关于java - 不带参数的静态方法是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029656/