CodeGym/Java kursus/Modul 3/Synchronizers: Synkronisering af adgang til ressourcer i ...

Synchronizers: Synkronisering af adgang til ressourcer i Java

Ledig

Semafor

Semaforer bruges normalt, når det er nødvendigt at begrænse antallet af tråde, når man arbejder med filsystemet. Adgang til en fil eller anden delt ressource styres gennem en tæller. Hvis dens værdi er større end nul, er adgang tilladt, men samtidig vil tælleren falde.

I det øjeblik, hvor tælleren returnerer nul, vil den aktuelle tråd blive blokeret, indtil ressourcen frigives af en anden tråd. Parameteren for antal tilladelser skal indstilles via konstruktøren.

Du skal vælge denne parameter individuelt, afhængigt af styrken på din computer eller bærbare computer.

public class Main {

   public static void main(String[] args) {
       Semaphore sem = new Semaphore(1);
       CommonResource res = new CommonResource();
       new Thread(new MyThread(res, sem, "MyThread_1")).start();
       new Thread(new MyThread(res, sem, "MyThread_2")).start();
       new Thread(new MyThread(res, sem, "MyThread_3")).start();
   }
}

class CommonResource {
   int value = 0;
}

class MyThread implements Runnable {
   CommonResource commonResource;
   Semaphore semaphore;
   String name;
   MyThread(CommonResource commonResource, Semaphore sem, String name) {
       this.commonResource = commonResource;
       this.semaphore = sem;
       this.name = name;
   }

   public void run() {

       try {
           System.out.println(name + "waiting permission");
           semaphore.acquire();
           commonResource.value = 1;
           for (int i = 1; i < 7; i++) {
               System.out.println(this.name + ": " + commonResource.value);
               commonResource.value++;
               Thread.sleep(150);
           }
       } catch (InterruptedException e) {
           System.out.println(e.getMessage() + " " + name);
           Thread.currentThread().interrupt();
       }
       System.out.println(name + "releases permission");
       semaphore.release();
   }
}

CountDownLatch og andre

CountDownLatch - Tillader flere tråde at vente, indtil et vist antal operationer udført på andre tråde er fuldført. Et eksempel er installationen af ​​en applikation: den starter ikke, før du accepterer vilkårene for brug, før du vælger en mappe, hvor du vil installere et nyt program, og så videre. Der er en speciel countDown() -metode til dette - denne metode reducerer nedtællingstælleren med én.

Så snart optællingen går til nul, vil alle ventende tråde i ventetiden fortsætte deres arbejde, og alle efterfølgende opkald af afventning vil passere uden at vente. Nedtællingstælleren er en engangstæller og kan ikke nulstilles.

CyclicBarrier - bruges til at synkronisere et givet antal tråde på et tidspunkt. Barrieren nås, når N tråde kalder await(...)-metoden og blokerer. Derefter nulstilles tælleren til sin oprindelige værdi, og de ventende tråde frigives. Derudover er det, hvis det er nødvendigt, muligt at køre brugerdefineret kode, før du fjerner blokering af tråde og nulstiller tælleren. For at gøre dette sendes et objekt med en implementering af Runnable- grænsefladen gennem konstruktøren .

Exchanger<V> Exchanger- klassen er beregnet til dataudveksling mellem tråde. Det skrives og indtaster den type data, som trådene skal udveksle.

Data udveksles ved hjælp af den eneste exchange() metode i denne klasse :

V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

x-parameteren repræsenterer den databuffer, der skal udveksles. Den anden form af metoden definerer også timeout- parameteren , timeout-parameteren og enhed , den type tidsenhed, der skal bruges til timeout- parameteren .

Phaser- klassen giver dig mulighed for at synkronisere tråde, der repræsenterer en enkelt fase eller et trin i udførelsen af ​​en samlet handling. Phaser definerer et synkroniseringsobjekt, der venter, indtil en bestemt fase er afsluttet. Phaseren går derefter videre til næste trin eller fase og venter på, at den er færdig igen.

Når man arbejder med Phaser- klassen , er det almindeligt først at oprette sit objekt. Dernæst skal vi tilmelde alle deltagere. For at registrere for hver deltager kaldes register()- metoden , eller du kan undvære denne metode ved at sende det nødvendige antal deltagere til Phaser- konstruktøren .

Derefter udfører hver deltager et bestemt sæt handlinger, der udgør fasen. Og Phaser- synkroniseringen venter, indtil alle deltagere har gennemført udførelsen af ​​fasen. For at informere synkronisatoren om, at fasen er afsluttet, skal deltageren kalde arrive() eller arriveAndAwaitAdvance() metoden . Synkronisatoren går derefter videre til næste fase.

1
Opgave
Modul 3,  niveaulektie
Låst
Arbeiten!
task4207
Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu