2016-01-31 1 views
1

Chaque variable de condition Java (wait() notify()) est associée à un seul mutex (synchronisé). J'ai été dit que (en Java), chaque mutex est aussi associé à une seule variable de condition, et c'est une implémentation moins efficace que les variables cond de pthreads et les mutex par exemple. Je ne peux pas comprendre celui-ci cependant. Qu'est-ce que ça veut dire? En quoi Java est-il différent des pthreads C/C++ sur celui-ci?Java Mutex Association avec variable de condition

Répondre

1

L'impossibilité d'associer plus d'une variable de condition à un seul mutex est limitative. Par exemple, supposons que vous souhaitiez implémenter une file d'attente de blocage multi-producteurs et multi-consommateurs (par exemple, java.util.concurrent.ArrayBlockingQueue).

Il ne doit y avoir qu'un seul mutex: il ne sera pas possible d'avoir un mutex pour les producteurs et un mutex pour les consommateurs. Mais en utilisant le mécanisme synchronized de Java, cela signifie qu'il ne peut y avoir qu'une seule variable de condition. Cela signifie qu'un consommateur qui rend la file d'attente "non pleine" doit signaler la même condition signalée par un producteur qui rend la file d'attente "non vide". Et que signifie que les producteurs et les consommateurs doivent notifyAll(), car sinon il n'y a aucune garantie que le fil qui est éveillé par un producteur ne sera pas un autre producteur ou que le fil unique éveillé par un consommateur ne sera pas un autre consommateur.

Dans une implémentation basée sur pthreads, la file d'attente peut avoir un mutex et une variable de condition à attendre pour les producteurs et une variable de condition différente pour les consommateurs.


Heureusement, la bibliothèque standard Java fournit une alternative de verrouillage: L'interface java.util.concurrent.locks.Lock définit un mutex qui peut donner un certain nombre de associés Condition objets.