Heim Backend-Entwicklung PHP-Tutorial Ausführliche Erläuterung der Verwendung von synchronisiert zum Implementieren eines Sperrcodes

Ausführliche Erläuterung der Verwendung von synchronisiert zum Implementieren eines Sperrcodes

Dec 20, 2017 am 11:56 AM
lock synchronized

In diesem Artikel wird erläutert, wie Sie einen Sperrcode mit Synchronisierung implementieren. Im Folgenden finden Sie einen praktischen Fall, auf den sich Freunde beziehen können.

Methode 1:

public synchronized void a(){
  //TODO
}
Nach dem Login kopieren


Methode 2:

public void b(){
  synchronized(this){
    //TODO
  }
}
Nach dem Login kopieren


Von hier In beiden Fällen wird die Sperre zwischen {} hinzugefügt. Schauen wir uns an, wie die Sperre ausgeführt wird:

public void c() {
  lock.lock();
  try {
    // TODO
  } finally {
    lock.unlock();
  }
}
Nach dem Login kopieren


Auf diese Weise wird die Sperre zwischen lock() hinzugefügt. und unlock(). Wenn Sie also eine Sperrfunktion implementieren möchten, müssen Sie darüber nachdenken, wie Sie diese beiden Methoden, die Methoden lock() und unlock(), implementieren. Definieren Sie zunächst ein FrameworkWie unten gezeigt:

public void lock(){
}
public void unlock(){
}
Nach dem Login kopieren


Dann möchten Sie synchronisiert verwenden, um diese beiden Methoden zu implementieren.

Jetzt habe ich tatsächlich eine etwas klarere Vorstellung, aber ich weiß immer noch nicht, wie ich diese beiden Methoden ausfüllen soll. Ich werde die Eigenschaften von Lock später analysieren und mir diesen Code ansehen:

public void c() {
    lock.lock();
    //When current thread get the lock, other thread has to wait
    try {
        //current thread get in the lock, other thread can not get in
        // TODO
    }
    finally {
        lock.unlock();
        //current thread release the lock
    }
}
Nach dem Login kopieren


Ich habe gerade einen kleinen Kommentar zu diesem Code hinzugefügt und nichts anderes getan. Hilft es, diesen Code zu verstehen? Häufiges Wort? Sollten wir beim Ausfüllen der Methoden lock() und unlock() auf das Schlüsselwort currentthread achten, um die Lösung zu finden? Die Antwort ist ja.

Analysieren Sie als Nächstes, wie der Thread bei Verwendung der Synchronisierung warten kann. Verwenden Sie die Methode wait(). Wie wecke ich den Thread auf? Verwenden Sie die notify()-Methode. Verwenden Sie dann die Methode wait() in der Methode lock() und die Methode notify() in der Methode unlock(). Es gibt also eine Bedingung, wenn wir wait() und notify() verwenden. Überlegen Sie, was wir als Bedingung verwenden sollten.

Wir sollten als Beurteilungsbedingung verwenden, ob die Sperre belegt ist. Überlegen Sie, ob wir diese Bedingung bei der Verwendung von synchronisiert verwendet haben.

Lassen Sie uns analysieren, wann die Sperre aufgehoben werden soll und welche Bedingungen verwendet werden. Denken Sie darüber nach, ob Thread B die Sperre aufheben kann. Natürlich nicht. Wenn B freigelassen werden könnte, würde das gegen das Prinzip verstoßen. Es muss sein, dass die Sperre von Thread A nur von Thread A aufgehoben werden kann. Die Beurteilungsbedingung besteht also darin, zu beurteilen, ob der Thread, der die Sperre hält, der aktuelle Thread ist. Wenn ja, kann er natürlich nicht freigegeben werden.

Schauen wir uns nun den vollständigen Code an:

package test.lock;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class NaiveLock {
    private static final long NONE = -1;
    private long owner = NONE;
    private Boolean isLooked() {
        return owner != NONE;
    }
    public synchronized void lock() {
        long currentThreadId = Thread.currentThread().getId();
        if (owner == currentThreadId) {
            throw new IllegalStateException("Lock has been acquired by current thread");
        }
        while (this.isLooked()) {
            System.out.println(String.format("thread %s is waitting lock", currentThreadId));
            try {
                wait();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        owner = currentThreadId;
        System.out.println(String.format("Lock is acquired by thread %s", owner));
    }
    public synchronized void unlock() {
        if (!this.isLooked() || owner != Thread.currentThread().getId()) {
            throw new IllegalStateException("Only Lock owner can unlock the lock");
        }
        System.out.println(String.format("thread %s is unlocking", owner));
        System.out.println();
        owner = NONE;
        notify();
    }
    public static void main(String[] args) {
        final NaiveLock lock = new NaiveLock();
        ExecutorService executor = Executors.newFixedThreadPool(20, new ThreadFactory() {
            private ThreadGroup group = new ThreadGroup("test thread group");
            {
                group.setDaemon(true);
            }
            @Override
                  public Thread newThread(Runnable r) {
                return new Thread(group, r);
            }
        }
        );
        for (int i = 0; i < 20; i++) {
            executor.submit(new Runnable() {
                @Override
                        public void run() {
                    lock.lock();
                    System.out.println(String.format("thread %s is running...", Thread.currentThread().getId()));
                    try {
                        Thread.sleep(new Random().nextint(1000));
                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.unlock();
                }
            }
            );
        }
    }
}
Nach dem Login kopieren


Führen Sie ihn aus und sehen Sie sich das Ergebnis an:

Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
  
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
  
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 22 is unlocking
  
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
  
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
  
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
  
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking
  
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
  
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
  
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
  
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
  
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
  
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
  
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
  
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
  
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking
Nach dem Login kopieren


Wenn Sie die for-Schleife auf 30 Mal ändern, sehen Sie sich das Ergebnis noch einmal an:

Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 8 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 26 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 25 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 27 is waitting lock
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 24 is waitting lock
thread 23 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 23 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 21 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 20 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 19 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 18 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
  
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
  
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
  
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
  
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
  
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
  
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
  
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
  
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking
  
Lock is acquired by thread 8
thread 8 is running...
thread 8 is unlocking
  
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
  
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
  
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
  
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
  
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
  
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking
Nach dem Login kopieren


Ich glaube, dass Sie die Methoden beherrschen, nachdem Sie diese Fälle gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Verwandte Lektüre:

Detailliertes Codebeispiel, wie PHP die Stack-Datenstruktur und den Bracket-Matching-Algorithmus implementiert

Am beliebtesten Code in PHP Einfacher String-Matching-Algorithmus, PHP-Matching-Algorithmus_PHP-Tutorial

Das einfachste String-Matching-Algorithmus-Tutorial in PHP

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Verwendung von synchronisiert zum Implementieren eines Sperrcodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Die Prinzipien und Nutzungsszenarien von Synchronized in Java sowie die Nutzungs- und Differenzanalyse der Callable-Schnittstelle Die Prinzipien und Nutzungsszenarien von Synchronized in Java sowie die Nutzungs- und Differenzanalyse der Callable-Schnittstelle Apr 21, 2023 am 08:04 AM

1. Grundfunktionen 1. Es beginnt mit einer optimistischen Sperre und wird bei häufigen Sperrkonflikten in eine pessimistische Sperre umgewandelt wird in eine Schwergewichtssperre umgewandelt. 3. Die Spin-Lock-Strategie, die am wahrscheinlichsten bei der Implementierung von Leichtgewichtssperren verwendet wird. 4. Es handelt sich um eine unfaire Sperre. 5. Es handelt sich um eine Wiedereintrittssperre. 6. Es handelt sich nicht um eine Lese-/Schreibsperre. 2. Die JVM Synchronisiert den Sperrvorgang. Sperren werden in die Zustände „keine Sperre“, „voreingenommene Sperre“, „leichte Sperre“ und „schwere Sperre“ unterteilt. Es wird je nach Situation nacheinander aktualisiert. Bei der voreingenommenen Sperre wird davon ausgegangen, dass der männliche Protagonist eine Sperre und die weibliche Protagonistin ein Thread ist. Wenn nur dieser Thread diese Sperre verwendet, können der männliche Protagonist und die weibliche Protagonistin für immer glücklich leben, auch wenn sie keine Heiratsurkunde erhalten (um hohe Werte zu vermeiden). -Kostenoperationen). Aber die weibliche Nebenrolle erscheint

So verwenden Sie Lock in Java-Multithreading So verwenden Sie Lock in Java-Multithreading May 12, 2023 pm 02:46 PM

Nach Jdk1.5 gibt es unter dem Paket java.util.concurrent.locks eine Reihe von Schnittstellen und Klassen für die Thread-Synchronisierung. Wenn es um die Thread-Synchronisierung geht, denkt jeder an das synchronisierte Schlüsselwort, bei dem es sich um ein integriertes Schlüsselwort handelt In Java wird die Thread-Synchronisierung durchgeführt, aber dieses Schlüsselwort weist viele Mängel auf und ist nicht sehr praktisch und intuitiv. Daher werden wir Lock im Folgenden vergleichen und erklären. Wenn wir das synchronisierte Schlüsselwort verwenden, treten normalerweise die folgenden Probleme auf: (1) Unkontrollierbarkeit, es ist nicht möglich, Sperren nach Belieben zu sperren und freizugeben. (2) Die Effizienz ist relativ gering. Beispielsweise lesen wir derzeit zwei Dateien gleichzeitig.

Welche Möglichkeiten gibt es, Lock in Java zu verwenden? Welche Möglichkeiten gibt es, Lock in Java zu verwenden? Apr 23, 2023 pm 08:52 PM

1. Funktion (1) Die Lock-Methode zum Erlangen von Sperren unterstützt Unterbrechungen, erwirbt sie nicht nach einer Zeitüberschreitung und ist nicht blockierend (2) Verbessert die Semantik, wo das Sperren und Entsperren ausgeschrieben werden muss (3) Lock-explizite Sperren können uns bringen Kommt mit guter Flexibilität, aber gleichzeitig müssen wir die Sperre manuell aufheben (4) Bedingungsbedingungsobjekt unterstützen (5) Erlauben Sie mehreren Lesethreads gleichzeitig den Zugriff auf gemeinsam genutzte Ressourcen 2. Sperrenverwendung // Holen Sie sich die Sperre voidlock() //Wenn der aktuelle Thread nicht unterbrochen wurde, erwirb die Sperre voidlockInterruptably()//Gib eine neue Bedingungsinstanz zurück, die an diese Sperrinstanz gebunden ist. ConditionnewCondition()//Sperre nur, wenn sie aufgerufen wird

Welche Funktionalität bietet die Java Lock-Klasse? Welche Funktionalität bietet die Java Lock-Klasse? Apr 21, 2023 am 08:16 AM

Hinweis 1. Lock ist eine Schnittstelle im Paket java.util.concurent, die eine Reihe von Sperroperationsmethoden definiert. 2. Die Lock-Schnittstelle umfasst hauptsächlich die Implementierungsklassen ReentrantLock, ReentrantReadWriteLock, ReentrantReadWriteLock und WriteLock. Im Gegensatz zu Synchronized bietet Lock verwandte Schnittstellen wie das Erfassen von Sperren und das Freigeben von Sperren, wodurch die Verwendung flexibler und die Bedienung komplexer wird. InstanceReentrantReadWriteLocklock=newReentrantReadWriteLock();Lockread

Beispielanalyse des Java-Schlüsselwortsynchronisierungsprinzips und des Sperrstatus Beispielanalyse des Java-Schlüsselwortsynchronisierungsprinzips und des Sperrstatus May 11, 2023 pm 03:25 PM

1. Das Konzept der Sperre in Java Spin Lock: Wenn ein Thread eine Sperre erhält und die Sperre von einem anderen Thread erworben wurde, wartet der Thread in einer Schleife und beurteilt dann weiter, ob die Sperre erfolgreich erworben werden kann es wird erfasst. Die Sperre verlässt die Schleife. Optimistische Sperre: Unter der Annahme, dass kein Konflikt vorliegt. Wenn beim Ändern der Daten festgestellt wird, dass die Daten nicht mit den zuvor erfassten Daten übereinstimmen, werden die neuesten Daten gelesen und die Änderung erneut versucht. Pessimistische Sperre: Gehen Sie davon aus, dass Parallelitätskonflikte auftreten, synchronisieren Sie alle datenbezogenen Vorgänge und beginnen Sie mit der Sperrung beim Lesen von Daten. Exklusive Sperre (Schreiben): Fügen Sie der Ressource eine Schreibsperre hinzu, aber andere Threads können sie nicht erneut sperren (einzelnes Schreiben). Gemeinsame Sperre (Lesen): Nach dem Hinzufügen einer Lesesperre zu einer Ressource kann diese nur gelesen, aber nicht geändert werden. Andere Threads können nur Lesesperren hinzufügen und keine Schreibsperren (mehrfach) hinzufügen. Siehe als S

Wie verwende ich synchronisiert, um den Synchronisierungsmechanismus in Java zu implementieren? Wie verwende ich synchronisiert, um den Synchronisierungsmechanismus in Java zu implementieren? Apr 22, 2023 pm 02:46 PM

Zusammenfassung der Verwendung von synchronisiert in Java 1. Bei Verwendung von synchronisiert als Funktionsmodifikator lautet der Beispielcode wie folgt: Publicsynchronizedvoidmethod(){//….} Dies ist die Synchronisationsmethode. Welches Objekt ist derzeit synchronisiert? Was er sperrt, ist der Aufruf dieses synchronisierten Methodenobjekts. Mit anderen Worten: Wenn ein Objekt P1 diese Synchronisationsmethode in verschiedenen Threads ausführt, schließen sie sich gegenseitig aus, um einen Synchronisationseffekt zu erzielen. Allerdings kann ein anderes Objekt P2, das von der Klasse generiert wird, zu der dieses Objekt gehört, diese Methode mit dem hinzugefügten synchronisierten Schlüsselwort willkürlich aufrufen. Der obige Beispielcode usw.

Was sind die drei Synchronisierungsmethoden in Java und wie werden sie verwendet? Was sind die drei Synchronisierungsmethoden in Java und wie werden sie verwendet? Apr 27, 2023 am 09:34 AM

1. Erklären Sie, dass synchronisiert unsere am häufigsten verwendete Synchronisierungsmethode ist und es drei Hauptmethoden gibt, sie zu verwenden. 2. Beispiel//Allgemeine Klassenmethodensynchronisation synchronisiertpublidvoidinvoke(){}//Klassenstatische Methodensynchronisation synchronisiertpublicstaticvoidinvoke(){}//Codeblocksynchronisation synchronisiert(object){}Der Unterschied zwischen diesen drei Methoden besteht darin, dass die synchronisierten Objekte unterschiedlich sind. Gewöhnliche Klassen synchronisieren das Objekt selbst, statische Methoden synchronisieren die Klasse selbst und Codeblöcke synchronisieren die Objekte, die wir in die Klammern füllen. Welche Sammlungen gibt es in Java?

Was ist das Prinzip und der Prozess des Java Synchronized Lock-Upgrades? Was ist das Prinzip und der Prozess des Java Synchronized Lock-Upgrades? Apr 19, 2023 pm 10:22 PM

Werkzeugvorbereitung Bevor wir offiziell über das Prinzip der Synchronisierung sprechen, sprechen wir zunächst über Spin-Locks, da Spin-Locks eine große Rolle bei der Optimierung der Synchronisierung spielen. Um Spinlocks zu verstehen, müssen wir zunächst verstehen, was Atomizität ist. Die sogenannte Atomizität bedeutet einfach, dass jede Operation entweder nicht ausgeführt wird oder dass sie während der Operation nicht unterbrochen werden kann. Um beispielsweise eine zu den variablen Daten hinzuzufügen, gibt es drei Schritte: Laden aus dem Speicher in das Register . Addiere eins zum Datenwert. Schreiben Sie das Ergebnis zurück in den Speicher. Atomizität bedeutet, dass ein Thread, der einen Inkrementierungsvorgang ausführt, nicht von anderen Threads unterbrochen werden kann. Nur wenn dieser Thread diese drei Prozesse abschließt

See all articles