java - 不带参数的静态方法是线程安全的吗?

标签 java multithreading

我有一个计数器,并且多个线程访问 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/

相关文章:

java - ExecutorService 多线程性能低

java - 如何在 Java ME 中将 StringBuffer 转换为 InputStream?

c++ - 从另一个类启动 QTimer

java - 并发:在自定义连接池中实现连接超时

Java - 从 HashMap 中选择一个随机值,但指定的整数最大

java - RESTful URL 似乎没有正确映射到使用 Spring MVC 的 url

用于从音频信号中提取 LTC SMPTE 时间码的 Java 类?

python - Python/OpenCV应用程序锁定问题

linux - 在 Linux 中创建新线程是否复制文件描述符和套接字描述符?

java - 如何更改垃圾收集线程的优先级?