Javaでは、オブジェクト自体が自身の状態を保護するためのロックとして機能できます。この規則は、Vectorやその他の同期されたコレクションなど、すべてのメソッドが同期され、オブジェクト自体の固有のロックによって保護される多くの組み込みクラスで使用されます。これは良いですか悪いですか?理由も教えてください。
質問する
308 次
2 に答える
3
長所
- 簡単だ。
- ロックは外部から制御できます。
短所
- それはカプセル化を破ります。
- 暗黙のコントラクトを変更せずにロック動作を変更することはできません。
ほとんどの場合、広く使用されるAPIを開発しているのでない限り、それは問題ではありません。したがって、使用synchronised(this)
は理想的ではありませんが、簡単です。
于 2012-06-28T14:34:31.697 に答える
1
さてVector
、Hashtable
などは内部的にこのように同期されており、私たちは皆、それらに何が起こったのかを知っています...
私は正直なところ、このような同期を行う正当な理由を見つけることができません。これが私が見る不利な点です:
- ほとんどの場合、メソッド全体をロックするよりも、スレッドセーフを確保するためのより効率的な方法があります。
- 実際にロックを必要とせずにロックとロック解除のオーバーヘッドを支払うため、シングルスレッド環境ではコードの速度が低下します。
- 各操作は同期されていますが、操作のシーケンスは同期されておらず、誤ってデータ競合が発生する可能性があるため、誤った安心感が得られます。各メソッドと次のコードで同期されるコレクションを想像してみてください。
if(collection.isEmpty()) { collection.add(...); }
目的が単一のアイテムのみを追加することであると仮定すると、両方の操作が個別に同期されていても、if
チェックと実際の呼び出しの間でスレッドが中断される可能性があるため、上記のコードはスレッドセーフではありません。したがって、実際には2つを取得できます。add
コレクション内のアイテム。
于 2012-06-28T14:58:22.587 に答える