java - 这段代码对于java中的唯一id来说是线程安全的吗

标签 java multithreading concurrency

我有一个简单的代码,我想用唯一的 id 生成对象。这是代码片段

public class Test {

    private static long counter = 0;
    private long id;

    private Test() {
        // Don't worry about overflow
        id = counter++;
    }

    // Will this method always Test Object with unique id?
    public static Test getTest() {
        return new Test();
    }

    public long getId() {
        return id;
    }

}

想知道 getTest 方法是否被多个线程调用,所有 TestObject 都会有唯一的 id 吗?

最佳答案

它不是线程安全的,因为两个线程可以同时执行 counter++,你可能会得到意想不到的结果。

您应该使用 AtomicInteger:

public class Test {

    private static AtomicLong counter = new AtomicLong(0);
    private long id;

    private Test() {
        // Don't worry about overflow
        id = counter.incrementAndGet();
    }

    // Will this method always Test Object with unique id?
    public static Test getTest() {
        return new Test();
    }

    public long getId() {
        return id;
    }
}

关于java - 这段代码对于java中的唯一id来说是线程安全的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28208592/

相关文章:

vb.net - 如何使用文件流/流写入器处理并发文件访问?

java - 我的 jax-ws web 服务客户端只返回空对象

java - 连接错误 : "org.jsoup.UnsupportedMimeTypeException: Unhandled content type"

php - 通过同时进行的Cron作业下载电子邮件附件-竞赛条件

Java 编码器性能

java - 在 Brian Goetz 的 Java Concurrency In Practice 中,为什么 Memoizer 类没有使用 @ThreadSafe 注释?

java - 让 Android 游戏更安全,免受黑客攻击

java - 使用 Java Swing 设置表中一行中突出显示的文本颜色

java - Android/Java线程同步: while(true){} causing blocking

Java volatile 需要同步访问吗?