当前位置:编程学习 > JAVA >>

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

 

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,