Java Multithreading - Thread-Safe Compteur

Je commence avec un exemple très simple dans le multithreading. Je suis en train de faire un thread-safe compteur. Je veux créer deux threads d'incrémenter le compteur de façon intermittente pour atteindre les 1000. Le Code ci-dessous:

public class ThreadsExample implements Runnable {
     static int counter = 1; //a global counter

     public ThreadsExample() {
     }

     static synchronized void incrementCounter() {
          System.out.println(Thread.currentThread().getName() + ": " + counter);
          counter++;
     }

     @Override
     public void run() {
          while(counter<1000){
               incrementCounter();
          }
     }

     public static void main(String[] args) {
          ThreadsExample te = new ThreadsExample();
          Thread thread1 = new Thread(te);
          Thread thread2 = new Thread(te);

          thread1.start();
          thread2.start();          
     }
}

De ce que je peux dire, le tout en boucle en ce moment signifie que seul le premier thread a accès au comptoir jusqu'à ce qu'il atteigne 1000. Sortie:

Thread-0: 1
.
.
.
Thread-0: 999
Thread-1: 1000

Comment puis-je régler ce problème? Comment puis-je obtenir les threads partagent le compteur?

Pourquoi pensez-vous que la boucle while signifie que?
Il n'y a rien de "réparer". La commutation entre les threads est cher, et le planificateur sera pas en alternance laisser les threads s'exécutent pour les appels seul à incrementCounter. Augmenter votre variable de boucle de 1000 à, disons, 1000000, alors vous verrez que le fils, en effet, changement dans l'entre-deux.
Alors que ce est une primitive exemple et il n'y a en effet pas de point de basculer entre les threads, il y a des cas où court mais les tâches critiques comme ce ne sont pas exécutées en raison d'un thread monopolisant le moniteur, causant de threads, potentiellement arrêter les progrès. Dans ce cas, il est certainement quelque chose de "réparer", par la mise en œuvre de l'équité de la politique.
qu'entendez-vous par "correctif"? Votre programme fonctionne comme prévu. Lorsque plusieurs threads s'exécutent en parallèle, la JVM n'est pas obligé de fournir le temps processeur pour tous. Ou avez-vous vous attendez à quelque chose d'autre?

OriginalL'auteur BrotherBarnabas | 2015-04-26