面试题:JDK中有哪些锁? 各有何特点?
答案:有sychronized关键字,ReentrantLock可重入锁,ReadWriteLock读写分离锁
sychronized可以修饰方法或代码块,它是可重入锁,也是非公平锁。
- 当synchronized作用于普通方法是,锁对象是this;
- 当synchronized作用于静态方法是,锁对象是当前类的Class对象;
- 当synchronized作用于代码块时,锁对象是synchronized(obj)中的这个obj。
一般而言,synchronized使用的锁对象是存储在Java对象头里的。
ReentrantLock 相对sychronized 功能更加强大和灵活,也是一个可重入锁,通过lock()方法加锁,unlock()方法解锁,解锁方法必须要放在finally块中释放!通过构造方法传入不同的参数来标记是否为公平锁。
公平锁是公平的,不会产生饥饿现象,但是性能比非公平锁低。
synchronized可以和wait/notify配合实现线程间通信。ReentrantLock也可以和Condition配合达到一样的效果,甚至可以实现更多的功能。
ReadWriteLock读写锁ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁,读锁使用共享模式;写锁使用独占模式。同时,读写锁之间也是互相排斥的,就是说,当一个线程获取读锁后,另外一个线程正在获取写锁时,必须等读锁释放才行。
Java并发库中ReetrantReadWriteLock实现了ReadWriteLock接口并添加了可重入的特性。