2015-01-14 5 views
6

私はこの構文に似た何かを探していますが、それは存在しません。Javaのオブジェクトで同期する

私は、メソッドをコレクションに作用させたい、メソッドの寿命の間、コレクションが混乱していないことを確認します。

だからそれは次のようになります。

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 
} 

ではなく、私は怖いです、これを行うための唯一の方法は、次のようになります。

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

は、それはそれを行うための最善の方法ですか?

+0

、ここでの唯一の違いは、インデントのレベルがあります。 – Radiodef

答えて

4

はい、となります。

private synchronized myMethod() { 
    // do work 
} 

と同等です:あなたはthis以外のインスタンスで同期させたいのであれば、あなたは他の選択肢を持っていませんが、メソッド内​​ブロックを宣言

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

4

このケースでは、同期リストを使用する方が良いでしょう:

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

コレクションAPIは、スレッドの安全のためにsynchronized wrapper collectionsを提供します。

メソッド本体のリストを同期させると、メソッドのライフタイム全体にわたってリストにアクセスする必要のある他のスレッドがブロックされます。

代替を手動でリストへのすべてのアクセスで同期されています。私は質問を誤解していない限り

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

    ... 

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

}