本文主要是介绍Lock使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
有关于并发,这里先将一个Lock吧。
- Lock是一个接口
public interface Lock {void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long time, TimeUnit unit) throws InterruptedException;void unlock();Condition newCondition();
}
有些方法是有返回值的,成功为true否则你懂的。
- ReentrantLock,意思是“可重入锁”,唯一一个实现了Lock接口的类 Lock lock = new
ReentrantLock(); //注意lock对象得是同一个。 ReadWriteLock也是一个接口,在它里面只定义了两个方法:
public interface ReadWriteLock {/*** Returns the lock used for reading.** @return the lock used for reading.*/Lock readLock();/*** Returns the lock used for writing.** @return the lock used for writing.*/Lock writeLock();
}
- 一个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作。
ReentrantReadWriteLock实现了ReadWriteLock接口。
lock与synchronized区别:
- synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized
synchronized就不是可中断锁,而Lock是可中断锁。
如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,想先处理其他事情,我们可以让它中断自己或者在别的线程中中断它,这种就是可中断锁。
- synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
锁的可重入性:
class MyClass {public synchronized void method1() {method2();}public synchronized void method2() {}
} // synchronized跟lock不需要再重新申请锁。
这篇关于Lock使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!