解決多線程導致的線程安全問題:
1:同步代碼塊
格式:
synchronized(鎖對象){
可以會出現線程安全問題的代碼(訪問了共享數據的代碼)
}
注意:
-
1:通過代碼塊中的鎖對象,可以使用任意對象(一般直接object)
-
2: 但是必須保證多個線程使用的鎖對象是同一個
-
3:鎖對象作用:把同步代碼塊鎖住,只讓一個線程在同步代碼塊中執行
2:定義同步方法
格式:
權限修飾符 synchronized 返回值類型 方法名(參數){
可以會出現線程安全問題的代碼(訪問了共享數據的代碼)
}
使用步驟:
將訪問了共享數據的代碼寫成一個方法,方法添加synchronized修飾符
定義一個同步方法,方法也會將內部代碼鎖住,只讓一個線程執行,
同步方法的鎖對象就是實現類 new RunnableImpl,也就是this
靜態同步方法的鎖對象是本類的class屬性—>class文件對象(反射)
不能是this了,this是創建對象後產生的,靜態方法優先於對象
3:Lock鎖
java.util.concurrent.locks.lock接口
Lock實現 提供了比使用synchronized方法和語句可獲得的更廣泛的鎖定操作
Lock接口的方法:
void lock() 獲取鎖
void unlock() 釋放鎖
使用步驟:
-
1:在成員位置創建一個ReentrantLock對象(接口的實現類對象)
-
2:在可能出現安全問題的代碼前調用lock鎖方法開啓鎖
-
3:在可以出現安全問題的代碼後調用unlock鎖方法關閉鎖