關於java線程鎖synchronized修飾普通方法與靜態方法的區別


最近研究線程方面問題,關於這個synchronized鎖修飾的問題,先是修飾普通方法,然后通過兩個線程,各自執行自己對象的鎖,發現方法執行互不影響,代碼如下:

  private static int num=0;
  private synchronized void printNum(String tag){
    try {
    if(tag.equals("a")){
      num=100;
      System.out.println("tag a,num set over!");
      Thread.sleep(1000);//休眠1秒
    }else{
      num=200;
      System.out.println("tag b,set num over!");
    }
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.println("tag :" +tag+", num="+num);
  }
  public static void main(String[] args) {
    MyThread02 my1=new MyThread02();
    MyThread02 my2=new MyThread02();
    //匿名內部類方式啟動線程
    new Thread(()->my1.printNum("a")).start();
    new Thread(()->my2.printNum("b")).start();
  },

執行結果如下,即可能一個線程剛設置完num,另一個線程來再來設置num,兩個線程兩個鎖沒有任何影響.

 

tag a,num set over!
tag b,set num over!
tag :b, num=200
tag :a, num=200

但是如果修飾的是靜態方法,發現打印順序就是一致的,也就是說此時這個方法同時只能一個線程執行,結果不變如下:

tag a,num set over!
tag :a, num=100
tag b,set num over!
tag :b, num=200

后面百度了解到,在多個線程多個鎖的情況下,

如果synchronized修飾在普通方法上,線程之間互無關系,可任意執行自己對象的鎖
如果在static方法上修飾synchronized表示鎖定了class類.多個線程都是相同的一把鎖,即
取得的鎖都是對象鎖,哪個線程先執行代碼,哪個線程就持有該方法所屬的對象鎖,其他對象就無法執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM