6.1 Lock 锁
6.1.1 Lock 锁 理解(ReentrantLock)
如果说 synchronized 被称为 同步锁,那么 Lock 就是比它 还要强大的 "同步锁" !
-
从JDK 5.0 开始,Java 提供了更加强大的线程同步机制 —— 通过显式定义同步锁对象来实现同步。同步锁使用 Lock 对象充当。
-
java.util.concurrent.locks.Lock 接口是 控制多个线程 对共享资源进行访问的工具。锁 提供了 对共享资源的独占访问。每次只能有一个 线程 对 Lock 对象加锁。线程开始访问 共享资源之前应先 获得 Lock 对象。
-
ReentrantLock(可重入锁) 类 是 Lock 接口的 实现,它 拥有与 synchronized 相同的并发性 和 内存语义,在实现线程安全的控制中,我们反而是 更常用于 ReentrantLock,可以显式 加锁、释放锁。
为什么说 synchronzied 没有 Lock 牛呢 ?
答:最主要的原因是,synchronzied 的 锁 是 隐式的,而 Lock 的锁 是 显式的,你能看到的。这样就不再是一个 抽象的概念了!
使用 Lock 锁,JVM 将花费较少的事件来调度线程,性能更好。并且 具有 更好的扩展性(提供更多的子类)
语法格式:
try{
lockop.lock();//直接提供一把锁并且把这个 锁 变成排它锁!也就是 开启锁的 功能!!
}finally{
lockop.unlock();//如果需要执行锁住的部分代码 出现了 try catch 的异常,那么 我们就需要 在 finnaly 这里 写上 unlock 进行 强制性关闭锁的操作!以确保安全性,变成 释放锁,开启 释放锁的功能!
}
我们一般情况 使用 Lock 锁,用的 是 ReentrantLock 这个类*,而不是自己去实现 Lock 这个接口,因为 太费劲 太复杂了。不如 直接 用它的 实现类。
package www.muquanyu.Seniorpart;import java.util.concurrent.locks.ReentrantLock;//测试Lock 锁
public class LockDemo {
public static void main(String[] args) {
//共同操作一个事务TestLock t1 = new TestLock();new Thread(t1).start();new Thread(t1).start();new Thread(t1).start();}
}class TestLock implements Runnable{
private int ticketNums = 10;
//我们一般情况 使用 Lock 锁,用的 是 ReentrantLock 这个类,而不是自己去实现 Lock 这个接口,因为 太费劲 太复杂了。不如 直接 用它的 实现类。ReentrantLock lock = new ReentrantLock();@Overridepublic void run() {
while(true){
try{
//加一个锁(直接提供给你一个锁!)lock.lock();if(ticketNums > 0){
try {
Thread.sleep(1000);} catch (InterruptedException e) {
e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}else{
break;}}finally {
//如果 执行的同步代码有 try catch 异常,那么就需要在//finally 这里 写上 unlock,否则写不写都一样!lock.unlock();}}}
}
Lock 锁 是非常 灵活的!需要在 加锁的地方,开启一下 变成排它锁,然后 需要在 关闭的时候,关闭一下,变成 释放锁。就可以 显式 的 完成 synchronized 的 功能了!!
6.1.2 synchronized 与 Lock 的对比
- Lock 是显式锁(手动开启和关闭锁,别忘记关闭锁)synchronized 是隐式锁,只要出了 作用域 就会自动释放!
- Lcok 只有代码块锁,synchronized 有代码块锁和方法锁。
- 使用 Lock 锁,JVM 将花费较少的事件来调度线程,性能更好。并且 具有 更好的扩展性(提供更多的子类)
- 优先使用顺序:
Lock (ReenTrantLock 类)
同步代码块(进入方法体后,分配响应资源)
同步方法(在方法头那里 进行声明)
实际上呢 ~ Lock 锁 在 使用方面 就是 synchronized 的 显示模式!所以 synchronized 要是学会了,那么 Lock 锁 也就学会了!