首页 > 编程语言 >JUC 源码解析:lock锁与synchronized锁的区别

JUC 源码解析:lock锁与synchronized锁的区别

时间:2024-05-14 17:22:38浏览次数:21  
标签:JUC Thread synchronized lock 源码 线程 Lock new

JUC 源码解析:lock锁与synchronized锁的区别

本文使用 jdk1.8

Lock 锁的使用注意事项

  • 要在 finally 块中释放锁。保障锁一定能被释放
  • 不要把加锁代码写进 try 块里。因为我们可能会自己实现Lock接口,在一些实现中,如果获取锁时发生了异常,可能导致锁被无故释放

lock 与 synchronized 的区别

1. synchronized 拓展性和灵活性不如 Lock

  • synchronized 能隐式的获取锁释放锁,虽然方便,但lock纯手动显得更灵活。

  • Lock 接口可以自己写实现类,可以实现很多自定义的方法,synchronized与它相比非常呆板


2. jstack 线程状态不同

使用 lock 加锁,和使用 synchronized 加锁。没拿到锁的线程,状态是不同的。

  • 线程如果没有竞争到 synchronized 锁,会呈现出 blocked 阻塞状态

  • 线程如果没有竞争到 Lock 锁,会呈现出 waiting 等待状态

来用代码演示看看,先看看synchronized锁状态:

static SheepLock lock = new SheepLock();

public static void main(String[] args) throws InterruptedException {
    new Thread(Main::trySheepLock, "A").start();
    new Thread(Main::trySheepLock, "B").start();


}

public static void trySheepLock() {
    synchronized (lock) {
        System.out.println(Thread.currentThread().getName() + "获取到小羊锁");

        while (true) {} // 无限循环,不释放锁
    }
}

在终端中用这样的命令查看 jstack 日志:

在日志中找到这A、B这两个线程

可以看到:

  • A抢到了锁,线程状态是 RUNNABLE
  • B没有抢到锁,线程状态是 BLOCKED ,是阻塞

把这段代码改成 Lock 锁,然后用相同的方法看看锁状态(SheepLock 是我自定义的Lock实现,可以满足基本的锁需求)

static SheepLock lock = new SheepLock();

public static void main(String[] args) throws InterruptedException {
    new Thread(Main::trySheepLock, "A").start();
    new Thread(Main::trySheepLock, "B").start();
}

public static void trySheepLock() {

    lock.lock();
    try {
        System.out.println(Thread.currentThread().getName() + "获取到小羊锁");
        while (true) {} // 无限循环,不释放锁

    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        lock.unlock();
    }

}

可以看到:

  • 线程A抢到了锁,状态是 RUNNABLE
  • 线程B没有抢到锁,状态是WATTING,是等待

3. Lock 可以响应中断

Lock 接口中有这样的方法定义

void lockInterruptibly() throws InterruptedException;

与 synchronized 不同,Lock 的这个方法可以响应中断。

当拿到锁的线程被中断时,异常会抛出,锁会被释放


4. Lock 可以设置:在截止时间之前获取锁

Lock 接口中有这样的方法定义:

boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

Lock 可以设置在截止时间之前获取锁,如果获取不到,会返回 false


5. Lock 可尝试非阻塞(非等待)获得锁

Lock 接口中有这样的方法定义:

boolean tryLock();

它可以尝试获取锁,只尝试一次,而不会让线程CAS自旋,失败一次就返回 false

标签:JUC,Thread,synchronized,lock,源码,线程,Lock,new
From: https://www.cnblogs.com/yangruomao/p/18191755

相关文章

  • 2024 AI中转计费平台系统源码
    简介:2024AI中转计费平台系统源码图片:    点击下载 ......
  • JAVA Comparator 自定义排序 源码分析
    对于一个数组来说如果我们想要从大到小排序一般会这么写Integer[]nums={1,2,3};Arrays.sort(nums,newComparator<Integer>(){@Overridepublicintcompare(Integera,Integerb){returnb-a;}});......
  • UcOs-III 源码阅读: os_time.c
    对实时时钟源文件os_time.c进行源码阅读与注释://功能:Tick级别延时、时间延时、恢复延时中的任务、获取/设置系统Tick值、实时时钟滴答函数//Tick级别延时API:OSTimeDly(ticks)//时间延时API:OSTimeDlyHMSM(p_hmsm)//恢复延时API:OSTimeDlyResume(task_id)//获取系统T......
  • varnish源码编译以及简单配置
    varnish安装系统centos7ip192.168.40.131禁止透明大页echonever>/sys/kernel/mm/transparent_hugepage/enabled减少最大堆栈大小ulimit-s256安装nginxyumlist|grep^nginx&&yum-yinstallnginx*mkdir/usr/share/nginx/html/helloecho“hellowo......
  • JUC源码解析:深入理解 volatile
    JUC源码解析:深入理解volatilevolatile的定义volatile的作用:保证可见性禁止指令重排序volatile可以被看作是轻量版的synchronized,volatile保证了多线程中共享变量的“可见性”,就是说,当volatile变量的值被修改时,其他线程能读取到被修改的变量值。如果volatile使用恰......
  • [附源码]新天龙八部3永恒经典之江山策仿官方_联网+单机搭建架设教程
    新天龙八部3永恒经典之江山策仿官_联网架设搭建_附赠GM工具+视频教程本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!!教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教程走也是可以搭建成功的,但是一定要有耐心......
  • JVM类加载器ClassLoader源码剖析
    在JVM类加载器分类中通过ClassLoader获取了不同类型的类加载器,它是如此之重要那么ClassLoader究竟为何物呢?通过源码分析(以jdk17示例):调试跟踪ClassLoader:......
  • qgroundcontrol开发环境搭建源码编译
    qgroundcontrol是一款无人机地面站开源软件,C++/QT开发在https://github.com/mavlink/qgroundcontrol上就能找到,选择稳定版下载最新的是2.6下载https://github.com/mavlink/qgroundcontrol/archive/Stable_V2.6.zipQT的对应版本http://download.qt-project.org/official_releas......
  • [附源码+文档]Java Swing小游戏源码合集(14款)_毕业设计必选项目
    (小众游戏塔防迷宫动作剧情类等)16款游戏源码Javaswing五子棋联网版源代码Javaswing贪吃蛇游戏开发教程+源码Javaswing超级玛丽游戏Javaswing俄罗斯方块项目源码Javaswing飞机大战游戏源码Javaswing雷电游戏源码Javaswing连连看游戏源码Javaswing模拟写字板源码......
  • [附源码]石器时代_恐龙宝贝内购版_三网H5手游_附GM
    石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!!教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了如果你是小白也没问题......