2016-04-06 7 views
1

eine einfache Liste zu haben:Kann ich auf die von einem synchronisierten Block in Java verwendete Sperre zugreifen?

private final List<Item> lst = new ArrayList(); 

Wenn ich Synchronisation benötigen, habe ich folgendes zu tun:

synchronized (lst) { 
    // Some code 
} 

Nun, ich brauche ein Condition Objekt erstellen Lock.newCondition() verwenden, kann ich die zugrunde liegenden Zugang Sperre verwendet von synchronized{}, um es zu verwenden, um meine Bedingung zu erstellen, oder sollte ich synchronisierte Blöcke entfernen und ein benutzerdefiniertes Objekt Lock verwenden?

+4

Letzteres. Die beiden sind Differenzkonstrukte. –

+3

Sie möchten vielleicht mehr Kontext angeben - eine Bedingung ist möglicherweise nicht notwendig für das, was Sie erreichen möchten. – assylias

+1

Related: http://stackoverflow.com/questions/15927011/why-cant-i-directly-access-and-lock-the-implicit-lock-that-objects-use-for-sy?rq=1 – Thilo

Antwort

5

Wenn Sie ein Condition-Objekt benötigen, ist dies ein klares Zeichen dafür, dass Ihnen die intrinsische Verriegelung nicht ausreicht. Sie werden

Lock lock = new ReentrantLock(); 
    Condition condition = lock.newCondition(); 

Wie auch immer verwenden müssen, wenn Sie Leistungen besorgt sind, dass kein Problem mit modernen virtuellen Maschinen ist. Explizites Sperren funktioniert genauso wie das eigentliche.

+1

und Wenn Sie das tun, können Sie wahrscheinlich die intrinsische Verriegelung entfernen. Normalerweise ist beides nicht nötig. – Thilo

+0

Ich würde sagen, Sie müssen es wahrscheinlich entfernen, da der Erwerb von zwei Sperren ohne eine genaue Reihenfolge der Erfassung zu Deadlock führen kann. (https://en.wikipedia.org/wiki/Dining_philosophers_problem) – snovelli

Verwandte Themen