synchronized 修飾靜態(tài)方法、普通方法與代碼塊的區(qū)別

概念:

類鎖:所有對(duì)象共用一個(gè)鎖

對(duì)象鎖:一個(gè)對(duì)象一把鎖,多個(gè)對(duì)象多把鎖。

一、synchronized修飾普通方法(對(duì)象鎖)

測(cè)試代碼:

class B{
    
    synchronized public void mB(String value) {
        for (int i = 0; i < 10; i++) {
            System.out.println(value);
            try{
                Thread.sleep(150);
            }catch(Exception e){
                
            }
        }
    }

    synchronized public void mC(String value) {
        for (int i = 0; i < 10; i++) {
            System.out.println(value);
            try{
                Thread.sleep(150);
            }catch(Exception e){
                
            }
        }
    }
    
}

public class Main {
    
    public static void main(String[] agrs){
        System.out.println("Main 線程 開始運(yùn)行!");
        final B b1 = new B();
        Thread t1 = new Thread(){
            @Override
            public void run(){
                System.out.println("t1 開始運(yùn)行!");
                b1.mB("HAHA");
                System.out.println("t1 結(jié)束運(yùn)行!");
            }
        };
        t1.start();
        Thread t2 = new Thread(){
            @Override
            public void run(){
                System.out.println("t2 開始運(yùn)行!");
                b1.mC("XIXI");
                System.out.println("t2 結(jié)束運(yùn)行!");
            }
        };
        t2.start();
           
        System.out.println("Main 線程 結(jié)束運(yùn)行!");
    }
}

打印結(jié)果:

Main 線程 開始運(yùn)行!
Main 線程 結(jié)束運(yùn)行!
t1 開始運(yùn)行!
HAHA
t2 開始運(yùn)行!
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
t1 結(jié)束運(yùn)行!
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
t2 結(jié)束運(yùn)行!

結(jié)論:修飾普通方法的時(shí)候,鎖的是當(dāng)前對(duì)象。
如果創(chuàng)建個(gè)新對(duì)象b2,則不能保持同步??!
例如下面的代碼,無(wú)法保持同步?。?!

public class Main {
    
    public static void main(String[] agrs){
        System.out.println("Main 線程 開始運(yùn)行!");
        final B b1 = new B();
        Thread t1 = new Thread(){
            @Override
            public void run(){
                System.out.println("t1 開始運(yùn)行!");
                b1.mB("HAHA");
                System.out.println("t1 結(jié)束運(yùn)行!");
            }
        };
        t1.start();
        
        final B b2 = new B();
        Thread t2 = new Thread(){
            @Override
            public void run(){
                System.out.println("t2 開始運(yùn)行!");
                b2.mC("XIXI");
                System.out.println("t2 結(jié)束運(yùn)行!");
            }
        };
        t2.start();
        System.out.println("Main 線程 結(jié)束運(yùn)行!");
    }
}

二、synchronized修飾靜態(tài)方法(類鎖)

B 類修改為如下:

class B{
    
    synchronized static public void mB(String value) {
        for (int i = 0; i < 10; i++) {
            System.out.println(value);
            try{
                Thread.sleep(150);
            }catch(Exception e){
                
            }
        }
    }

    synchronized static public void mC(String value) {
        for (int i = 0; i < 10; i++) {
            System.out.println(value);
            try{
                Thread.sleep(150);
            }catch(Exception e){
                
            }
        }
    }
    
}

結(jié)論:就算兩個(gè)不同的對(duì)象,也可以保持同步?。。?/p>

三、synchronized修飾代碼塊(也分類鎖、對(duì)象鎖)

class B{
 public void mB(String value) {
        synchronized(B.class){
            for (int i = 0; i < 10; i++) {
                System.out.println(value);
                try{
                    Thread.sleep(150);
                }catch(Exception e){
                    
                }
            }
        }
        
    }
 public void mC(String value) {
        synchronized(B.class){
            for (int i = 0; i < 10; i++) {
                System.out.println(value);
                try{
                    Thread.sleep(150);
                }catch(Exception e){
                    
                }
            }
        }
    }
}

上面是類鎖:所有對(duì)象可以保持同步。

class B{
 public void mB(String value) {
        synchronized(this){
            for (int i = 0; i < 10; i++) {
                System.out.println(value);
                try{
                    Thread.sleep(150);
                }catch(Exception e){
                    
                }
            }
        }
        
    }
 public void mC(String value) {
        synchronized(this){
            for (int i = 0; i < 10; i++) {
                System.out.println(value);
                try{
                    Thread.sleep(150);
                }catch(Exception e){
                    
                }
            }
        }
    }
}

上面是對(duì)象鎖:同一對(duì)象可以保持同步,不同對(duì)象不可保持同步。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容