2016-03-18 7 views
0

Ich muss die Funktion myFunc() von der Ausführung von mehreren Threads isolieren. Ich kann diese Aufgabe mit Mutex lösen. Seit Java 1.4 nicht unterstützt Mutex wie auf andere Weise diese Aufgabe zu lösen?Mutex in Java 1.4

+3

Put maximale Anstrengung Java-Version zu aktualisieren ... – mks

Antwort

1

In Java haben alle Objekte eine intrinsische Sperre, auch als Monitorsperre bezeichnet. Dies reicht aus, um einen einfachen gegenseitigen Ausschluss zu ermöglichen, hat jedoch Einschränkungen.

public final class MyClass1 { 
    public synchronized void myFunc() { 
     // Exclusive work here 
    } 
} 

synchronized Das Schlüsselwort für das Verfahren bedeutet, dass die intrinsische Verriegelung der MyClass1 Objektinstanz erfaßt werden muss, bevor myFunc laufen kann.

public static final class MyClass2 { 
    private final Object mutex = new Object(); 
    public void myFunc() { 
     synchronized (mutex) { 
      // Exclusive work here 
     } 
     // There is no mutual exclusion here 
    } 
} 

Ein Block innerhalb einer Methode kann für den Bereich des Blocks synchronisiert werden. Dies ermöglicht Ihnen auch, das Objekt auszuwählen, um die Sperre zu erhalten.

Eine intrinsische Sperre wird entweder irgendwann erreicht oder der Thread hängt. Ein Versuch, eine intrinsische Sperre zu erhalten, ist nicht Timeout und kann nicht unterbrochen werden.

Eine intrinsische Sperre ist reentrant, sodass Sie sich keine Sorgen darüber machen müssen, dass ein Thread mit sich selbst blockiert. Deadlocks können immer noch auftreten, wenn Sperren in verschiedenen Aufträgen erfasst werden.

Das synchronisierte Schlüsselwort gewährleistet auch die Sichtbarkeit von Lese- und Schreibvorgängen, wenn beide in einem synchronisierten Code stattfinden, der dasselbe Objekt sperrt.

https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html https://docs.oracle.com/javase/tutorial/essential/concurrency/memconsist.html

Sie sollen auch wissen, dass das Java-Speichermodell seit 1.4 so viel von den aktuellen Informationen ist nicht anwendbar geändert hat.

https://www.ibm.com/developerworks/library/j-jtp03304/

+1

ziehe ich die letzte Objektsperre über die Synchronisierungsmethode. Synchronisierungsmethoden, die die Instanz sperren, können bei mehr als einer synchronisierten Methode zu Problemen führen. –