J'ai écrit la source la plus simple de reproduire le problème comme suitComportement inattendu dans concurrency (Java)
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();
}
}
}
Ce que je pense: Identifiants uniques dans aucun ordre
Ce que j'ai trouvé: Plusieurs 1s (tout autre nombre est unique mais pas '1')
Il semble que je n'ai pas compris certains concepts de base de la concurrence. Pouvez-vous me dire ce que je fais mal?
Merci c'était facile :) Je me sens honteux – skuzuc
En effet, je pense qu'il voulait placer le mot-clé 'synchronized' comme modificateur pour getInstance mais l'a obtenu pour' inc', ce qui ne fait aucun sens. – Val