本文共 1671 字,大约阅读时间需要 5 分钟。
可重入锁:占有锁的线程可以重新进入.
不仅判断锁有没有被锁上,还会判断锁是谁锁上的,当就是自己锁上的时候,那么他依旧可以再次访问临界资源,并把加锁次数加一。 设计了加锁次数,以在解锁的时候,可以确保所有加锁的过程都解锁了,其他线程才能访问。不然没有加锁的参考值,也就不知道什么时候解锁?解锁多少次?才能保证本线程已经访问完临界资源了可以唤醒其他线程访问了。实现相对复杂。
广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。
在java 中,synchronized和java.util.concurrent.locks.ReentrantLock是可重入锁。可重入锁在只要是同一线程的情况下,就可以重新进入,即使调用不同的方法, 其临界资源也是安全的.
可重入锁可以理解为我们常用的对象锁的升级版
Object lock = new Object();public void method() { synchronized(lock) { ... }}
而不可重入锁, 即使是同一线程,一旦某方法占有了锁,其他需要锁的方法也是不能进入的.如果调用了其他需要占用锁的方法,就会造成死锁.
可重入锁中维护了一个private volatile int state来计数重入次数,在执行每次操作之前,判断当前锁持有者是否是当前对象,采用state计数,不用频繁的持有释放操作,这样既提升了效率,又避免了死锁。
在 java 并发包中有一些并发框架也使用了自旋 CAS 的方式来实现原子操作,比如 LinkedTransferQueue 类的 Xfer 方法。CAS 虽然很高效的解决原子操作,但是 CAS 仍然存在三大问题。ABA 问题,循环时间长开销大和只能保证一个共享变量的原子操作。
转载地址:http://eebws.baihongyu.com/