關鍵字synchronized還能夠應用在static靜態方法上,若是這樣寫,那是對當前的*.java文件對應的Class類進行持鎖。java
package synStaticMethod; /** * Created by Administrator on 2017/1/22 0022. */ public class Service { synchronized public static void printA(){ try{ System.out.println("線程名稱爲:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"進入printA"); Thread.sleep(3000); System.out.println("線程名稱爲:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"離開printA"); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized public static void printB(){ System.out.println("線程名稱爲:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"進入printB"); System.out.println("線程名稱爲:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"離開printB"); } }
package synStaticMethod; /** * Created by Administrator on 2017/1/22 0022. */ public class ThreadA extends Thread{ public void run(){ Service.printA(); } }
package synStaticMethod; /** * Created by Administrator on 2017/1/22 0022. */ public class ThreadB extends Thread { public void run(){ Service.printB(); } }
package synStaticMethod; /** * Created by Administrator on 2017/1/22 0022. */ public class Run { public static void main(String[]args){ ThreadA threadA = new ThreadA(); threadA.setName("A"); threadA.start(); ThreadB threadB = new ThreadB(); threadB.setName("B"); threadB.start(); } }
線程名稱爲:A在1485063366543進入printA
線程名稱爲:A在1485063369543離開printA
線程名稱爲:B在1485063369543進入printB
線程名稱爲:B在1485063369543離開printB
從結果來看,是同步的效果,和將synchronized關鍵字加到非靜態方法上使用的效果是同樣的,其實synchronized關鍵字加到static靜態方法上是給Class類上鎖,而synchronized關鍵字加到非static靜態方法上是給對象加鎖。spa