深刻理解synchronized方法同步的是方法仍是對象?

一.運用synchronized關鍵字安全

首先咱們來看看一個多線程中線程不安全的列子多線程

代碼以下:ide

共享數據類:測試

public class NotSynchronizated extends Thread {
    private int num =10;
    @Override
    public void run(){
        try {
            System.out.println("當前線程爲:"+currentThread().getName());
            num--;
            System.out.println("num的值爲:"+num);
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

線程測試類:spa

public class Text {

    public static void main(String[] args) {
        //將共享數據放入3個線程裏進行處理
        NotSynchronizated notSynchronizated = new NotSynchronizated();
        Thread t1=new Thread(notSynchronizated,"A");
        Thread t2=new Thread(notSynchronizated,"B");
        Thread t3=new Thread(notSynchronizated,"C");
        Thread t4=new Thread(notSynchronizated,"D");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

在這個列子中run方法沒有使用關鍵字synchronized,那麼就會形成線程不安全,結果以下:線程

 

那麼當咱們使用關鍵字synchronized後結果就會同步了,結果以下:code

 

那麼,在這裏是對這個run方法進行了同步呢?仍是對這個對象進行了同步呢?對象

二.synchronized同步的是對象blog

 爲了證實synchronized同步的是對象,咱們舉出下面的代碼:資源

共享資源類:

public class SynchronizatedObject extends Thread {
    private int num=20;
    @Override
    public synchronized void run(){

        System.out.println("當前的線程爲"+currentThread().getName());
        num--;
        System.out.println("當前num爲"+num);
    }

}

 測試類:

public class Text {

    public static void main(String[] args) {
        SynchronizatedObject synchronizatedObject1=new SynchronizatedObject();//建立第一個資源共享類
        SynchronizatedObject synchronizatedObject2=new SynchronizatedObject();//建立第二個資源共享類
        Thread t1=new Thread(synchronizatedObject1,"A");//加入
        Thread t2=new Thread(synchronizatedObject2,"B");//加入
        t1.start();
        t2.start();
    }
}

結果以下:

從這裏明顯看出這個synchronized關鍵字同步的是對象而不是方法,

若是同步的是方法那麼他將不會出現這種線程不安全的狀況,而是兩對象一個一個按順序的進入這個同步的方法裏,

出現這中狀況,只能說明他是對象同步的。

因此說這段代碼意思是我建立了兩個對象,同時我也建立了兩把對象鎖來同步話各自的run方法,只不過每一條線程的調用順序不一樣纔會出現這樣的結果。

總結:synchronized關鍵字同步的是對象不是方法

相關文章
相關標籤/搜索