6

存在しませんが、この構文に似たものを探しています。

コレクションに対してメソッドを動作させ、メソッドの存続期間中、コレクションが台無しにされないようにしたいと考えています。

したがって、次のようになります。

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
    }
}

それが最善の方法ですか?

4

2 に答える 2

4

はい、それが唯一の方法です。

private synchronized myMethod() {
    // do work
}

次と同等です。

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

したがって、 以外のインスタンスで同期したい場合は、メソッド内でブロックをthis宣言する以外に選択肢はありません。synchronized

于 2015-01-14T21:41:58.497 に答える
4

この場合、同期リストを使用することをお勧めします。

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

コレクション API は、スレッド セーフのために同期されたラッパー コレクションを提供します。

メソッド本体のリストで同期すると、メソッドの存続期間全体にわたってリストにアクセスする必要がある他のスレッドがブロックされます。

別の方法は、リストへのすべてのアクセスを手動で同期することです。

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

    ...

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

 }
于 2015-01-14T21:42:32.903 に答える