線程不安全的問題怎麼解決?
synchronized和lock都能解決線程不安全的問題
一、synchronized
三種同步方式:同步代碼塊(使用自定義明鎖)、同步函數(使用this鎖)、同步靜態函數(使用字節碼文件,即類.class)
- synchronized使用的有哪些關鍵字呢?
wait()、notify()、notifyAll()是三個定義在Object類裏的方法,可以用來控制線程的狀態。
- sleep() 和 wait()區別?
sleep()在Thread類中,wait()在Object類中;
sleep不會釋放鎖,而wait()則會釋放鎖,調用notify()後纔會進入運行狀態;
二、lock
爲什麼會有lock鎖?
解決了synchronized不能手動上鎖開鎖的問題
jdk1.5以上併發包 有:lock、線程池Executors、Condition
寫法爲:
Lock lock = new ReentrantLock();
lock.lock();
try{
//可能會出現線程安全的操作
}finally{
//一定在finally中釋放鎖
//也不能把獲取鎖在try中進行,因爲有可能在獲取鎖的時候拋出異常
lock.ublock();
}
Condition類的使用似於synchronized中的 wait()和notify(),用法如下:
Condition condition = lock.newCondition();
res. condition.await(); 類似wait
res. Condition. Signal() 類似notify
Signalall notifyALL
三、synchronized和lock區別
synchronized不需要釋放鎖,lock需要開鎖釋放鎖