多線程(七)---多線程同步相關問題

多線程(七)---多線程同步相關問題

(一)同步機制

  同步:多線程狀況下只保證一次只有一個線程在執行,其餘線程進不來,這就是同步機制

  好處:解決了多線程的安全問題

  弊端:減低效率

(二)同步前提

  問:多線程安全問題出現後,加了同步機制依舊有問題,如何解決?

  答:問題緣由,不是同一個鎖致使的

同步的前提:多線程在同步必須使用同一個鎖,這纔是多線程的同步

錯誤代碼

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

正確代碼演示:

代碼演示

相關文章
相關標籤/搜索