gpt4 book ai didi

java - 并发中的意外行为 (Java)

转载 作者:行者123 更新时间:2023-11-29 03:19:24 25 4
gpt4 key购买 nike

我写了最简单的源来重现问题如下

package concurrency.test;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

public class Main
{
public static void main(String[] args)
{
new Main().start();
}

private void start()
{
for (int i = 0; i < 20; i++)
{
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new SequencePrinter(), 1, 1, TimeUnit.SECONDS);
}
}

private class SequencePrinter implements Runnable
{
@Override
public void run()
{
System.out.println( IdGenerator.instance().nextId());
}
}

private static class IdGenerator
{
private static IdGenerator instance;
private final AtomicLong idSequence = new AtomicLong( 0 );

private IdGenerator()
{
}

public static IdGenerator instance ()
{
if ( instance == null )
{
instance = new IdGenerator();
}

return instance;
}

synchronized public long nextId ()
{
return idSequence.incrementAndGet();
}
}
}

我期望的是:没有顺序的唯一 ID

我发现了什么:多个 1(任何其他数字都是唯一的,但不是“1”)

看来我对并发的一些基本概念没有理解。你能告诉我我做错了什么吗?

最佳答案

IdGenerator 类的 instance() 方法不是线程安全的,因此可能会创建此类的多个实例,每个实例都有自己的 idSequence 成员变量,当多个线程并发调用该方法时。

您需要使 instance() 方法成为线程安全的,例如通过使其同步

关于java - 并发中的意外行为 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24625753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com