2.2.15內(nèi)置類與同步:實(shí)驗(yàn)2

本實(shí)驗(yàn)測(cè)試同步代碼塊synchronized(class2)對(duì)class2上鎖后,其他線程只能以同步的方式調(diào)用class2中的靜態(tài)同步方法。

/**
 * @author wuyoushan
 * @date 2017/4/28.
 */
public class OutClass {
    static class InnerClass1{
        public void method1(InnerClass2 class2){
            String threadName=Thread.currentThread().getName();
            synchronized (class2){
                System.out.println(threadName+" 進(jìn)入InnerClass1類中的method1方法");
                for (int i = 1; i < 10 ; i++) {
                    System.out.println(Thread.currentThread().getName()+" i="+i);
                    try{
                        Thread.sleep(100);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
                System.out.println(threadName+" 離開InnerClass1類中的method1方法");
            }
        }

        public synchronized void method2(){
            String threadName=Thread.currentThread().getName();
            System.out.println(threadName+" 進(jìn)入InnerClass1類中的method2方法");
            for (int j = 0; j <10; j++) {
                System.out.println("j="+j);
                try{
                    Thread.sleep(100);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            System.out.println(threadName+" 離開InnerClass1類中的method2方法");
        }
    }

    static class InnerClass2{
        public synchronized void method1(){
            String threadName=Thread.currentThread().getName();
            System.out.println(threadName+" 進(jìn)入InnerClass2類中的method1方法");
            for (int k = 0; k < 10; k++) {
                System.out.println("k="+k);
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
            System.out.println(threadName+" 離開InnerClass2類中的method1方法");
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
        final OutClass.InnerClass1 in1=new OutClass.InnerClass1();
        final OutClass.InnerClass2 in2=new OutClass.InnerClass2();
        Thread t1=new Thread(new Runnable() {
            @Override
            public void run() {
                in1.method1(in2);
            }
        },"T1");

        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                in1.method2();
            }
        },"T2");

        Thread t3=new Thread(new Runnable() {
            @Override
            public void run() {
                in2.method1();
            }
        },"T3");
        t1.start();
        t2.start();
        t3.start();
    }
}

程序的運(yùn)行結(jié)果為:

T1 進(jìn)入InnerClass1類中的method1方法
T2 進(jìn)入InnerClass1類中的method2方法
T1 i=1
j=0
T1 i=2
....
T1 離開InnerClass1類中的method1方法
T3 進(jìn)入InnerClass2類中的method1方法
j=9
k=0

摘選自 java多線程核心編程技術(shù)-2.2.15

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容