synchronizedとロックは違います.

3085 ワード

From:
http://blog.csdn.net/ningguixin/article/details/23950521
synchronizedはJVMに委託して実行しますが、lockはjavaが書いた制御錠のコードです.Java 1.5では、synchronizeは性能が低い.これはヘビー級の操作なので、操作インターフェースを呼び出す必要があります.ロックをかけるよりも多くの時間がかかります.Javaを使って提供されるLockオブジェクトよりも性能が高い.しかし、Java 1.6になると、変化が起きました.synchronizeは意味がはっきりしていて、いろいろな最適化ができます.スピン、ロック除去、ロック粗化、軽量級錠、バイアス錠などがあります.Java 1.6でのsynchronizeの性能はロックに劣らない.公式によると、synchronizeも支持しており、今後のバージョンでは最適化の余地があるという.ここでは、この2つのメカニズムの具体的な違いを紹介したいです.私が知っている限りでは、synchronizedは元々CPU悲観ロック機構を採用していました.即ちスレッドは独占ロックを獲得しました.独占ロックは、他のスレッドがブロックに依存してスレッドのリリースを待つしかないことを意味する.CPUがスレッドブロッキングを変換するとスレッドコンテキストが切り替わり、多くのスレッドが競合してロックされると、CPUのコンテキスト切り替えが頻繁に行われるため、効率が低い.ロックは楽観ロック方式を使用しています.楽観ロックとは、毎回ロックをかけないで、衝突がないと仮定して、ある操作を完成します.もし衝突が失敗したら、もう一度試して、成功するまで.楽観的なロックが実現する仕組みは、CAS操作です.RentrantrantLockのソースコードをさらに研究することができますが、その中で重要な鍵を得るための一つの方法はcompreAndSetStateであることが分かります.ここでは、呼び出したCPUが提供する特殊コマンドです.現代のCPUは、共有データを自動的に更新し、他のスレッドの干渉を検出するコマンドを提供していますが、ロックの代わりに、これらを使用しています.このアルゴリズムは、非ブロッキングアルゴリズムと呼ばれ、スレッドの失敗または他のスレッドの失敗またはマウントに影響を与えるべきでないアルゴリズムを意味する.私もこのステップを理解しただけです.具体的にCPUのアルゴリズムに興味がある読者は調べてみてもいいです.もっと良い説明があればメッセージをくれます.私も勉強しています.
 
 
1.あるスレッドはロックの制御権を待っている間は中断が必要です.2.wait-notifyを別々に処理する必要があります.Reentrant Lockの中のCondationアプリケーションは、notifyのどのスレッドを制御できますか?公平なロック機能を持っています.来るスレッドごとに並んで待ちます.
------------以上引用http://blog.csdn.net/natian306/article/details/18504111
1,3ネット上では明確な説明があります.
 
以下の2を参照してください.以下はjavaアプリのcondtitionに対する記述の一部のコードを参照してください.waitとnotifiy
wait:Causes the current thread to wait until eigher another thread invokes the notify() method or the notifyAll() method for is oject、or a specified amount of time has elapt.
 
nofity:Wakes up a single thread that is waiting on this oject's monitor.If any threads are waiting on this oject,one of the m is to be awakened.The choice is arbitrary and occurst the the screation of monta.com.
Nofityはこのオブジェクトがwaitのスレッドを起動するしかありません.次のconditionは、条件に応じて、そのスレッドを起動するように制御することができる.以下の例は、制御可能なnotFullとnotEmptyです.
[java]view plin copy
<p>クラス BoundedBuffer {  
  •  final ロック ロック = new Reentrant Lock();  
  •  final コンディショニング notフル = lock.newCondition()  
  •  final コンディショニング notEmpty = lock.newCondition()  
  •  final Object[] アイテム = new Object[100];  
  •  要点 putptr、 タッキーtr count;

     public void put(Object) x) ローソン InterruptedException {  

  •   lock.lock();  
  •   try {  
  •    while (count == items.length)  
  •     not Full.await()  
  •    items[putptr] = x;  
  •    if (++putptr) == items.length)  
  •     putptr = 0;  
  •    ++count;  
  •    notEmpty.signal()  
  •   } finally {  
  •    lock.unlock();  
  •   }  
  •  }

     public Object タケ() ローソン InterruptedException {  

  •   lock.lock();  
  •   try {  
  •    while (count == 0)  
  •     notEmpty.await()  
  •    Object x = items[Taeptr]  
  •    if (++taeptr == items.length)  
  •     テイクアウト = 0;  
  •    --count;  
  •    not Full.signal();  
  •    return x;  
  •   } finally {  
  •    lock.unlock();  
  •   }  
  •  }  
  • }