zoukankan      html  css  js  c++  java
  • 静态内部类与锁

    首先,有一个例子

    public class OutClass {
        static class InnerClass1 {
            public void method1(InnerClass2 class2){
                String threadName = Thread.currentThread().getName();
                synchronized (class2) {
                    System.out.println(threadName + "进入InnerClass1类中的method1方法");
                    for(int i = 0; i < 10; i++){
                        System.out.println("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 +"进入InnerClass1类中的method2方法");
                    for(int i = 0; i < 10; i++){
                        System.out.println("i=" + i);
                        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 + "进入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方法");
            }
        }
    }
    public class Run {
        public static void main(String[] args) {
            final InnerClass1 in1 = new InnerClass1();
            final InnerClass2 in2 = new InnerClass2();
            Thread t1 = new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    in1.method1(in2);
                }
            },"T1");
            Thread t2 = new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    in1.method2();
                }
            },"T2");
            Thread t3 = new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    in2.method1();
                }
            }, "T3");
            t1.start();
            t2.start();
            t3.start(); 
        }
    }
    T1进入InnerClass1类中的method1方法
    T2进入InnerClass1类中的method2方法
    i=0
    i=0
    i=1
    i=1
    i=2
    i=2
    i=3
    i=3
    i=4
    i=4
    i=5
    i=5
    i=6
    i=6
    i=7
    i=7
    i=8
    i=8
    i=9
    i=9
    T2离开InnerClass1类中的method2方法
    T1离开InnerClass1类中的method1方法
    T3进入InnerClass2类中的method1方法
    k=0
    k=1
    k=2
    k=3
    k=4
    k=5
    k=6
    k=7
    k=8
    k=9
    T3离开InnerClass2类中的method1方法

    运行这个小例子,会发现是T1和T2是异步,T3与其他两个是同步的,显然T3有锁被T1或者T2拿到了。如上图所示。

    首先,T1和T2是异步的很好理解,一个获取的锁是当前对象,一个获取的是类,不是一样的当然是异步。

    那么看T3:

    将t1.start()这个代码注掉,查看结果:

    T2进入InnerClass1类中的method2方法
    i=0
    T3进入InnerClass2类中的method1方法
    k=0
    k=1
    i=1
    k=2
    i=2
    i=3
    k=3
    i=4
    k=4
    k=5
    i=5
    i=6
    k=6
    i=7
    k=7
    k=8
    i=8
    i=9
    k=9
    T3离开InnerClass2类中的method1方法
    T2离开InnerClass1类中的method2方法

    异步的,也就是说T2与T3获取的不是同一个锁。T2获取的是in1。

    也就是说T1与T3获取的是同一个锁,T1的锁是in2,T3的锁也是in2.

  • 相关阅读:
    两个栈实现一个队列
    DacningLinks实现
    boost::implicit_cast
    hibernate查询之Criteria实现分页方法(GROOVY语法)
    VS2015 android 设计器不能可视化问题解决。
    当Eclipse爱上SVN
    你不知道的getComputedStyle
    推荐的软件
    React之表单
    理解javascript中的Function.prototype.bind
  • 原文地址:https://www.cnblogs.com/caobojia/p/6016841.html
Copyright © 2011-2022 走看看