【JAVA多线程中的锁机制】

JAVA中的每个对象都可以用作一个实现同步的锁,这种称为内置锁,内置锁是可重入的,因此如果某个线程试图获取一个已经由它自己持有的锁,那么这个请求就会成功。

  重入的实现方法是,为每个锁关联一个获取计数值和一个所有者线程,当计数值为0,这个锁就是开放的,当线程请求该锁时,JVM将记下锁的持有者,并且将计数值+1,如果同一个线程再次回去该锁,计数值继续+1,通过计数值可以看出重入的次数,计数值为0,则表示锁已经释放。

  看一个重入锁的实例:

  class Father {

  public synchronized void doSth(){

  System.out.println("Father is doSth...");

  }

  }

  class Child extends Father {

  public synchronized void doSth() {

  System.out.println("Child is doSth...");

  super.doSth();

  }

  }

  class Father {

  public synchronized void doSth(){

  System.out.println("Father is doSth...");

  }

  }

  class Child extends Father {

  public synchronized void doSth() {

  System.out.println("Child is doSth...");

  super.doSth();

  }

  }

  以上一段代码,在执行Child类的super.doSth()方法时,并不会发生死锁现象,这两个类中的方法都是synchronized同步的,因此执行前都会获取Father的锁,正因为是可重入的,才可以多次获取该锁,不然,第二次获取该锁时必然发生死锁现象。

  synchronized虽然提供了状态同步的功能,加锁限制,但是使用时,一定要切记加锁代码块的大小,否则会影响性能,这种同步代码块的大小需要去权衡。

posted on 2013-09-08 16:02  挖掘者者者  阅读(161)  评论(0编辑  收藏  举报