靜態同步synchronized方法和synchronized(class)代碼塊

關鍵字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

相關文章
相關標籤/搜索