深刻理解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關鍵字同步的是對象不是方法

相關文章
相關標籤/搜索