一.運用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關鍵字同步的是對象不是方法