Java中的synchronized(同步代碼塊與同步方法)

代碼實例如下:

package runnable;

import java.math.BigDecimal;

public class ThreadDemo { 
        public static void main(String[] args) {
          SynObject synObject=new SynObject();
          test tes=new test();
            Runnable r1=()->{synObject.methodA();};
            Runnable r2=new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    synObject.methodB();
                }
            };
            Thread t1=new Thread(r1);
            Thread t2=new Thread(r2);
            Thread t3=new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    synObject.methodC();
                }
            });
            Thread t4=new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    tes.methodD();
                    tes.methodE();
                }
            });
            t1.start();
            t2.start();
            t3.start();

            t4.start();
        }
}
class SynObject{
    public static Object ObjectSyn=new Object();
    public synchronized void methodA(){
        System.out.println("methodA");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void methodB(){
        synchronized(this){
            System.out.println("methodB");
        }
    }
    public void methodC(){
        synchronized(ObjectSyn){
            System.out.println("methodC");
            try {
                Thread.sleep(50000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
class test{
    public void methodD(){
        synchronized(SynObject.ObjectSyn){
            System.out.println("methodD");
        }
    }
    public void methodE(){
        synchronized(SynObject.ObjectSyn){
            System.out.println("methodE");
        }
    }
}

以上代碼運行結果爲:

methodA和methodC很快被打印出來,接着等了數秒,methodB被打印出來,再接着等了數秒,methodD和methodE被打印出來。

通過上面的例子說明:methodA和methodB用的是同一把鎖,methodC和methodD以及methodE用的是同一把鎖,當線程4獲得鎖對象SynObject.ObjectSyn時,它就可以進入這個鎖對象關聯的所有代碼塊(這個例子中爲methodE)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章