JAVA多线程中的锁机制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://xxlcube.blog.csdn.net/article/details/10143903

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();
	}
}

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


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

展开阅读全文

没有更多推荐了,返回首页