ReentrantLock锁简析
ReentrantLock使用
ReentrantLock是可以替代synchronized的,但是ReentrantLock需要手动加锁(lock.lock())和解锁(lock.unlock()),手动解锁一定要写在try...finally里边保证最好一定要解锁,不然上锁后中间执行的过程就有问题了,一旦死了,别人就永远也拿不到这把锁了。
public class MyReentrantLock { /**初始化锁 */ Lock lock = new ReentrantLock(); public void m1(){ try { lock.lock(); //synchronized(this) for (int i = 0; i < 10; i++) { TimeUnit.SECONDS.sleep(i); System.out.println(i); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) { MyReentrantLock myReentrantLock = new MyReentrantLock(); new Thread(myReentrantLock::m1).start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }
ReentranLock使用优势
1.ReentrantLock可以使用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行,synchronized如果搞不定就阻塞了,但是ReentrantLock可以自己决定要不要wait
2.ReentrantLock可以用lock.lockInterruptibly()这个类,对interrupt()方法做出响应,可以被打断的加锁
3.Reentrantlock还可以指定为公平锁,公平锁的意思是当我们new一个ReentrantLock,可以传一个参数为true,这个true表示公平锁,公平锁的意思是谁在前面就先让谁执行,而不是说谁后来了之后就马上执行,ReentrantLock默认是非公平锁。
当你发现自己的才华撑不起野心时,就请安静下来学习吧