2015-01-14 4 views
6

Ich bin auf der Suche nach etwas ähnlich wie diese Syntax, obwohl es nicht existiert.Synchronisieren für ein Objekt in Java

Ich möchte eine Methode für eine Sammlung und für die Lebensdauer der Methode sicherstellen, dass die Sammlung nicht durcheinander gebracht wird.

das könnte also wie folgt aussehen:

private void synchronized(collectionX) doSomethingWithCollectionX() { 
    // do something with collection x here, method acquires and releases lock on 
    // collectionX automatically before and after the method is called 
} 

sondern, ich bin der einzige Weg, Angst, dies zu tun wäre:

private void doSomethingWithTheCollectionX(List<?> collectionX) { 
    synchronized(collectionX) { 
     // do something with collection x here 
    } 
} 

Ist das der beste Weg, es zu tun?

+0

Wenn ich die Frage bin Missverständnis, der einzige Unterschied ist hier eine Einrückungsebene. – Radiodef

Antwort

4

Ja ist es die nur Weg.

private synchronized myMethod() { 
    // do work 
} 

entspricht:

private myMethod() { 
    synchronized(this) { 
     // do work 
    } 
} 

Also, wenn Sie auf einer anderen Instanz synchronisieren möchten als this, Sie haben keine andere Wahl haben, als die synchronized Block innerhalb der Methode deklarieren.

4

Es wäre besser, eine synchronisierte Liste in diesem Fall zu verwenden:

List<X> list = Collections.synchronizedList(new ArrayList<X>()); 

Die Sammlungen API synchronized wrapper collections für Thread-Sicherheit bietet.

Durch die Synchronisierung in der Liste im Methodenhaupttext werden andere Threads blockiert, die für die gesamte Lebensdauer der Methode auf die Liste zugreifen müssen.

Die Alternative ist manuell synchronisieren auf alle Zugriff auf die Liste:

private void doSomethingWithTheCollectionX(List<?> collectionX){ 
    ... 
    synchronized(collectionX) { 
     ... e.g. adding to the list 
    } 

    ... 

    synchronized(collectionX) { 
     ... e.g. updating an element 
    } 

}