2016-04-07 7 views
0

質問はここにあります: "スレッドセーフの選択の劇場にとって最高のパフォーマンスを持つこれらの選択肢はどれですか?Javaのロック<この問題は何ですか?>

private static List<ReadWriteLock> lockList = initializeLocks(); 
public boolean bookSeat(int seatNumber, int customerID){ 
    lockList.get(seatNUmber).writeLock().lock; 
    try{ 
     Seat seat = listOfSeats.get(seatNumber); 
     if(seat.isAvailable()){ 
      seat.setCustomer(customerID); 
      return true; 
     } else { return false; } 
    } // end try 
    finally { lockList.get(seatNumber).writeLock().unlock; } 
} 

public static List<Lock> lockList = initializeLocks(); 
public boolean bookSeat(int seatNumber, int customerID){ 
    lockList.get(seatNumber).lock(); 
    try{ 
     Seat seat = listOfSeats.get(seatNumber); 
     if(seat.isAvailable()){ 
      seat.setCustomer(customerID); 
      return true; 
     } else { return false; } 
    } // end try 
    finally { lockList.get(seatNumber).unlock(); } 
} 

そんなにみんなありがとう!私の理解から、私の学校の教授から集まったものから、明らかに両方の作品は、オプション2が正しいものです。私はなぜ、どちらが他のものより優れているのか分かりません。あなたたちが助けてくれることを願っています!ありがとうございました!

答えて

0

2番目の方法では、読み取り専用ではなく書き込み専用にリソースをロックします。最初のメソッドは、両方の操作をロックします。

したがって、2番目のロックは別のプロセスがリソースを読み取ることを許可しますが、最初のロックでは許可しません。最初は、より高価な操作ですが。

あなたは公式ドキュメントではこのようなものを見ることができます:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html#writeLock()

1

最初はただ目は書き込みロックを使用して、通常のロックを使用しています。

普通のロックから独占

あなたがロックを持っていたら、他のスレッドが別のロックをつかむことはできません。したがって、これは基本的に排他ロックです。書き込み

あなたが書き込みロックを持っていたら、他のスレッドが別のWriteロックをつかむことはできませんが、彼らはReadロックをつかむことができるため独占 -

書き込みロック。

リードロックからあなたは読み取りロックを持っていたら、他のスレッドがロックを読み取ることができます書き込みロック

と協働します。ただし、読み取りロックが取られている間は書き込みロックを取ることはできません。

基本的には、読み取りロックと書き込みロックの間で、ouは書き込み中に排他アクセスをアレンジすることができますが、誰もが読んでいるだけの場合はすべて無料です。

これらの選択肢のうち、スレッドセーフな選択の劇場にとって最高のパフォーマンスを発揮するものはどれですか?

一般に、読み書きしている場合は、読み書きロックを使用するとパフォーマンスが向上します。通常のロックはすべてのアクセスを停止します。

+0

ライトロックについての部分は正しいですか?書き込みロックは書き込みロックを取らないようにしますか? – Kayaman

関連する問題