当前位置: 代码迷 >> 综合 >> JavaThread 13 Lock 锁
  详细解决方案

JavaThread 13 Lock 锁

热度:82   发布时间:2023-11-24 13:47:34.0

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 将花费较少的事件来调度线程,性能更好。并且 具有 更好的扩展性(提供更多的子类)
  • 优先使用顺序:
  1. Lock (ReenTrantLock 类)

  2. 同步代码块(进入方法体后,分配响应资源)

  3. 同步方法(在方法头那里 进行声明)

实际上呢 ~ Lock 锁 在 使用方面 就是 synchronized 的 显示模式!所以 synchronized 要是学会了,那么 Lock 锁 也就学会了!

  相关解决方案