java基础(jdk1.8)
**
**
此篇博客主要讲如何使用ReentrantLock
本篇链接
ReentrantLock是Java的一个类
底层使用CAS
ReentrantLock锁可以代替synchronized,而且控制更加方便 但线程数小于等于2的时候(简单模型)使用synchronized加锁,但必须必须必须手动释放锁 syn锁定如果遇到异常的时候,jvm会自动释放锁,但lock必须手动释放锁,因此常在finally内进行锁的释放unlock();
tryLock();尝试加锁,不管锁定与否,方法都继续执行 boolean类型返回值,true表示拿到锁,false表示没有拿到锁 tryLock(时间长度,时间单位);等待给定时间长度,如果还拿不到锁,继续执行
lockInterruptibly();同lock,可加锁,但可以对interrupt()方法做出响应 也就是其他线程调用当前用此方法等待线程的interrupt方法可以打断阻塞状态
ReentrantLock o1 = new ReentrantLock(); //普通加锁 public void method1(){ o1.lock(); System.out.println("method1 加锁区间"); o1.unlock(); } //尝试加锁 public void method2(){ o1.tryLock(); System.out.println("method2 加锁区间"); o1.unlock(); } //尝试加锁 (1s拿不到锁继续执行) public void method3(){ boolean flag = false; try { flag = o1.tryLock(1,TimeUnit.SECONDS); if (flag == true) { System.out.println("method3 加锁区间"); } } catch (InterruptedException e) { e.printStackTrace(); }finally { if (flag == true) o1.unlock(); } } //相应打断式加锁 public void method4(){ try { o1.lockInterruptibly(); System.out.println("method4 加锁区间"); } catch (InterruptedException e) { e.printStackTrace(); }finally { o1.unlock(); } }reentrantLock可以指定为公平锁
ReentrantLock rl = new ReentrantLock(true);synchronized是非公平锁。等待某资源的所有线程都是等概率拿到锁 公平锁则是对等待线程的等待时间进行计时,保证公平,谁等待时间长谁拿锁
公平锁效率较非公平差
ReentrantLock详解
synchronized是Java关键字,而ReentrantLock是类
加锁方式synchronized加的是对象锁,是锁膨胀的一个过程,锁膨胀不可逆
ReentrantLock是通过方法加锁,底层是CAS+AQS
公平锁ReentrantLock可以指定公平锁,默认非公平。
synchronized是非公平锁
响应ReentrantLock可以尝试加锁,获不获得锁都会继续执行,且可以指定等待获取锁的时间。还可以指定对Interrupter做出相应
synchronized必须拿到锁才能执行,而且synchronized无法指定锁的获取时间
释放ReentrantLock必须手动释放锁
synchronized会自动释放锁
上一篇 》Synchronized、volatile及原子操作类使用
下一篇 》死锁