多線程(七)---多線程同步相關問題
(一)同步機制
同步:多線程狀況下只保證一次只有一個線程在執行,其餘線程進不來,這就是同步機制
好處:解決了多線程的安全問題
弊端:減低效率
(二)同步前提
問:多線程安全問題出現後,加了同步機制依舊有問題,如何解決?
答:問題緣由,不是同一個鎖致使的
同步的前提:多線程在同步必須使用同一個鎖,這纔是多線程的同步
錯誤代碼
public void run(){ while (true){ synchronized (new Object()){ // 每一個線程都使用的本身的鎖,致使問題發生 if (tickets>0){ System.out.println(Thread.currentThread().getName()+"------tickets:"+tickets--); } } } }
(三)同步注意點
多線程同步要分清須要同步的代碼,切記不要隨意添加synchronized(obj)
(四)同步函數
1)、分析多線程是否存在安全隱患?
1.線程中是否有共享數據。
2.是否有多條線程操做共享數據。
2)、同步函數:其實就是在函數上加上了同步關鍵字進行修飾
3)、同步的表現形式有兩種:1.同步代碼塊 2.同步函數
(五)同步函數使用的鎖是什麼呢?函數須要被對象調用,那個對象不肯定,可是都用this來表示
同步函數使用的鎖就是this.
驗證同步函數使用的是this。驗證需求:啓動兩個線程。
1:一個線程負責執行同步代碼塊(使用明鎖)
2:一個線程負責執行同步函數(使用this)
兩個線程執行相同線程任務,若是他們沒有相同的鎖,說明他們沒有同步,會出現數據錯誤
錯誤代碼演示:
正確代碼演示:
(六)驗證statci同步函數鎖是類名.class
若是同步函數被static修飾呢?
一、static隨着類的加載,這時不必定有該類的對象,可是,必定有該類的字節碼文件對象
二、這個對象簡單的表現形式:類名.class
正確代碼演示: