2016-04-06 7 views
1

は、単純なリストを持って:、私は根本的にアクセスすることができ、Lock.newCondition()を使用してConditionオブジェクトを作成する必要が今Javaの同期ブロックで使用されるロックにアクセスできますか?

synchronized (lst) { 
    // Some code 
} 

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

私は同期を必要とする

は、私は次の操作を行うために使用されますロックを synchronized{}で使用して自分の状態を作成するか、同期ブロックを削除してカスタム Lockオブジェクトを使用する必要がありますか?

+4

後者です。 2つは違いのコンストラクトです。 –

+3

あなたはより多くの文脈を与えたいかもしれません - あなたが達成しようとしているものに対して条件が必要でないかもしれません。 – assylias

+1

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

答えて

5

Conditionオブジェクトが必要な場合は、組み込みロックでは不十分であることを明確に示す記号です。

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

とにかく、パフォーマンスが心配な人は、現代の仮想マシンでは問題ありません。明示的なロックは、本質的なロックと同様に実行されます。

+1

およびもしあなたがそれをしているなら、あなたはおそらく本質的なロックを取り除くことができます。通常はどちらも必要ありません。 – Thilo

+0

正確な取得順序を指定しないで2つのロックを取得すると、デッドロックが発生する可能性があるため、ほとんど削除する必要があります。 (https://en.wikipedia.org/wiki/Dining_philosophers_problem) – snovelli

関連する問題