Maison  >  Article  >  Java  >  Exemple de sémaphore mutex et de mécanisme d'attente multi-thread en Java

Exemple de sémaphore mutex et de mécanisme d'attente multi-thread en Java

黄舟
黄舟original
2017-09-22 11:54:081850parcourir

Cet article présente principalement des exemples de verrous mutex, de sémaphores et de mécanismes d'attente multi-thread dans la programmation Java. Il présente brièvement la différence entre les verrous mutex et les sémaphores. Les amis qui en ont besoin peuvent en savoir plus.

Les verrous mutex et les sémaphores sont des concepts de base conçus pour la programmation simultanée dans le système d'exploitation. La différence conceptuelle entre les verrous mutex et les sémaphores est que pour la même ressource, les verrous d'exclusion mutuelle n'ont que le concept. de 0 et 1, mais les sémaphores sont plus que cela. En d'autres termes, le sémaphore peut permettre à plusieurs threads d'accéder à la ressource en même temps, tandis que le mutex n'est accessible que par un seul thread à la fois
L'implémentation du mutex en Java est ReetranLock lors de l'accès. une ressource synchronisée, son L'objet doit obtenir ce verrou via la méthode tryLock(). S'il échoue, il renvoie false, et s'il réussit, il renvoie true. Déterminez s’il faut accéder à la ressource synchronisée en fonction des informations renvoyées. Regardez l'exemple suivant


public class ReentranLockExample {
 private static int count = 0;
 private static ReentrantLock reentrantLock = new ReentrantLock();
 static class MyThread extends Thread{
  @Override
  public void run() {
   super.run();
   try {
    while (true){
     boolean result = reentrantLock.tryLock();
     if (result){
      System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count ++);
      reentrantLock.unlock();
     }else{
      System.out.println(Thread.currentThread().getName() + "get the lock failed and run the syn code " + count);
     }
     System.out.println(Thread.currentThread().getName() + "run the asyntronized code " + count);
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  thread1.start();
  thread2.start();
 }
}

Le sémaphore est équivalent à un compteur Si un thread veut accéder à une ressource, il doit d'abord obtenir le sémaphore de cette ressource, et le signal Le compteur interne de la quantité est décrémenté de 1. Le compteur interne du sémaphore est supérieur à 0, ce qui signifie qu'il y a des ressources qui peuvent être utilisées. Lorsque le thread a fini d'utiliser une ressource, le sémaphore de cette ressource doit être utilisé. être libéré. L'une des fonctions d'un sémaphore est de spécifier un thread pour accéder à une certaine ressource. Il suffit de l'initialiser.

L'implémentation du sémaphore en Java est Sémaphore, qui est passé sous forme d'entier lors de l'initialisation pour spécifier l'accès simultané maximal aux ressources de synchronisation


public class SemaphoreExample {
 private static Semaphore semaphore = new Semaphore(2);
 private String lock = "lock";
 private static int count = 0;
 static class MyThread extends Thread {
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     semaphore.acquire();
     Thread.sleep(500);
     System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count++);
     semaphore.release();
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  MyThread thread3 = new MyThread();
  thread1.start();
  thread2.start();
  thread3.start();
 }
}

CountDownLatch implémente un mécanisme d'attente, comme attendre l'arrivée des participants avant de démarrer une conférence. ConutDownLatch est un compteur lors de l'initialisation pour spécifier le nombre à attendre. En programmation concurrente, le problème à résoudre est d'attendre que tous les threads atteignent un certain point. Commencez simplement l'étape suivante, qui s'apparente un peu à une réunion. La réunion ne peut commencer que lorsque tous les participants sont arrivés


public class CountDownLatchExample {
 private static CountDownLatch mCountDownLatch = new CountDownLatch(3);
 static class MyThread extends Thread {
  int awaitTime;
  public MyThread(int i) {
   this.awaitTime = i;
  }
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     Thread.sleep(awaitTime);
     System.out.println(Thread.currentThread().getName() + "arrived " );
     mCountDownLatch.countDown();
     mCountDownLatch.await(); //可以指定等待时间
     System.out.println(Thread.currentThread().getName() + "start meeting " );
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread(500);
  MyThread thread2 = new MyThread(1000);
  MyThread thread3 = new MyThread(2000);
  thread1.start();
  thread2.start();
  thread3.start();
 }
}

. Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn