Java之synchronized可重入性的理解


1  synchronized可重入性的理解

当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,如果当前锁是重入性,会请求将会成功,如果当前锁不是可重入性,会等待当前对象锁的释放,实际上该对象锁已被当前线程所持有,不可能再次获得,就会产生死锁,在java中synchronized是基于原子性的内部锁机制,是可重入的,因此在一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法,也就是说一个线程得到一个对象锁后再次请求该对象锁,是允许的,还有就是当子类继承父类时,子类也是可以通过可重入锁调用父类的同步方法,这就是synchronized的可重入性。

2  测试synchronized方法调用synchronized方法

1)代码

    import java.io.*;
     
     
    class Parent    {
        public synchronized void willDo()    {
            System.out.println("我是父类的方法");
        }
    }
     
     
    class Child extends Parent {
     
        @Override
        public synchronized void willDo() {
            super.willDo();
            System.out.println("我是子类方法");
        }
     
        public static void main(String[] args) {
            Child child = new Child();
            child.willDo();
        }
    }


2)运行结果

    我是父类的方法
    我是子类方法

3 测试子类synchronized方法调用父类synchronized方法

1)代码

    class Test implements Runnable    {
        static Test instance = new Test();
        static int i=0;
        static int j=0;
        @Override
        public void run() {
            for(int j = 0; j < 10; j++) {
     
                //当前实例对象锁
                synchronized(this){
                    i++;
                    willDo();
                }
            }
        }
     
        public synchronized void willDo()    {
            j++;
        }
     
        public static void main (String[] args) throws java.lang.Exception    {
            Thread t1 = new Thread(instance);
            t1.start();
            t1.join();
            System.out.println(i);
        }
    }

 

2)运行结果

10


作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)