Bonjour,


Je suis sur un petit problème de performances : je voudrais supprimer mon synchronized du code suivant en utilisant l'API java.util.concurrent pour gagner en performances. Avez-vous des idées de ce qui pourrait m'aider ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyService implements Runnable {
  private AtomicBoolean running = new AtomicBoolean(false);
  private final List<String> strings = new ArrayList<String>();
 
  public void addString(String s) { strings.add(s); }
  public void removeString(String s) { strings.remove(s); }
  public void run () {
    if (running.compareAndSet(false, true)) {
      while (isRunning()) {
        List<String> copy;
        synchronized (strings) {
          copy = new ArrayList<String>(strings);
        }
        for (String s: copy) {
          // Traitement long et coûteux, d'où le synchronized précédent
        }
      }
    }
  }
  public boolean isRunning() { return running.get(); }
  public void stop() { running.compareAndSet(true, false); }
}