java并发编程(一)可重入内置锁

      每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。

      “重入”意味着获取锁的操作的粒度是“线程”,而不是调用。重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程所持有,当线程请求一个未被持有的锁时,JVM将记下锁的持有者,并且将获取计数值置为1,如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应地递减。当计数值为0时,这个锁将被释放。

    简单可以理解为 如果某个线程获得了某个代码块的锁,之后的调用过程中任然使用的是之前获得的锁。

 

    public class Father  
    {  
        public synchronized void doSomething(){  
            ......  
        }  
    }  
      
    public class Child extends Father  
    {  
        public synchronized void doSomething(){  //获得Child实例的锁
            ......  
            super.doSomething();  //再请求Child实例的锁
        }  
    }  

 

     由于Fither和Child中的doSomething方法都是synchronized方法,因此每个doSomething方法在执行前都会获取Child对象实例上的锁。如果内置锁不是可重入的,那么在调用super.doSomething时将无法获得该Child对象上的互斥锁,因为这个锁已经被持有,从而线程会永远阻塞下去,一直在等待一个永远也无法获取的锁。重入则避免了这种死锁情况的发生。

 

posted @ 2016-12-19 15:27  文洁丫头  阅读(394)  评论(0编辑  收藏  举报