毎日一例マルチスレッド[day 1]--synchronizedとロック競争


[javascript] view plin copy
  • /** 
  •  * 複数スレッド1本のロック 
  •  *  
  •  * スレッドの安全概念: 
  •  *        複数のスレッドがあるクラス(オブジェクトまたは方法)にアクセスすると、このオブジェクトは常に正しい挙動を示します. 
  •  * このクラス(オブジェクトや方法)はスレッドの安全です. 
  •  *  
  •  * synchronized:任意のオブジェクトおよび方法にロックをかけることができますが、ロックをかけるこのコードは「相互反発エリア」または「臨界エリア」と呼ばれます. 
  •  *  
  •  *  
  •  * 説明:MyThread類のrun方法にロックsynchronizedとロックなしプリントの違いを観察します. 
  •  *  
  •  * @author jeff 
  •  * 
  •  */  
  •   
  • public class MyThread extends Thread{	
     
  • private int count = 5 ;
  •  
  • public void run(){
  • count--;
  • System.out.println(Thread.currentThread().getName() + " count = "+ count);
  • }
  •  
  • public static void main(String[] args) {
  •  
  • MyThread myThread = new MyThread();
  • Thread t1 = new Thread(myThread,"t1");
  • Thread t2 = new Thread(myThread,"t2");
  • Thread t3 = new Thread(myThread,"t3");
  • Thread t4 = new Thread(myThread,"t4");
  • Thread t5 = new Thread(myThread,"t5");
  • t1.start();
  • t2.start();
  • t3.start();
  • t4.start();
  • t5.start();
  • }
  • }
  • t 1からt 5までの複数のスレッドを作成し、MyThreadのrun方法を実行します.もしrun方法がsynchronizedキーワードを追加しない場合、結果は以下の通りです.
     
  • t1 count = 2
  • t5 count = 1
  • t3 count = 2
  • t2 count = 1
  • t4 count = 0
  • 私たちが予想していた結果とは違っています.私達がrun方法にsynchronizedキーワードを加えると、次のようになります.
     
  • t3 count = 4
  • t1 count = 3
  • t4 count = 2
  • t5 count = 1
  • t2 count = 0
  • つまり、複数のスレッドが同一のオブジェクトにアクセスするrun法は、同期対象ロックの制御を受ける.
    解析:複数のスレッドがmyThreadのrunメソッドにアクセスするときは、キューに並べて処理する(ここでは、CPUに割り当てられた順序に従って処理する).一つのスレッドが、synchronizedの修飾を実行したい場合のコード:  1ロックを試してみます
      2ロックを取れば、synchronizedコード体の内容を実行します.
                 ロックが取れないと、このスレッドはこのロックを獲得しようと試みます.手に入れるまで、複数のスレッドが同時にこのロックを競います.(つまりロック競争の問題があります)
               3 ロック競争問題:複数スレッドが一つのロックを奪うとCPUの消耗がひどくなり、プログラムが遅くなります.   したがって、我々のプログラム設計はマルチスレッドのロック競争を回避し、システムオーバーヘッドを低減する.