当前位置: 首页 > news >正文

LockSupport是什么

 LockSupport是什么

 

 LockSupport让线程等待和唤醒的方法和Object类中的区别:

 

  • 方式一:使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程
  • 方式二:LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程

 

 

方式一Object类中的wait和notify方法实现线程等待和唤醒:

监视器锁(synchronized)基于锁对象头(objectLock)中的 Mark Word 和操作系统的管程 (Monitor)
实现,通过锁对象的等待队列来管理线程状态

  • wait和notify方法必须要在同步代码块或者方法里面,且成对出现使用
  • 先wait再notify才ok

/**
 * @author Guanghao Wei
 * @create 2023-04-11 12:13
 */
public class LockSupportDemo {

    public static void main(String[] args) {
        Object objectLock = new Object();
        /**
         * t1     -----------come in
         * t2     -----------发出通知
         * t1     -------被唤醒
         */
        new Thread(() -> {
            synchronized (objectLock) {
               
System.out.println(Thread.currentThread().getName() + "\t -----------come
in");
                try {
                   
objectLock.wait();
                } catch
(InterruptedException e) {
                   
e.printStackTrace();
                }
               
System.out.println(Thread.currentThread().getName() + "\t -------被唤醒");
            }
        }, "t1").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            synchronized (objectLock) {
                objectLock.notify();
               
System.out.println(Thread.currentThread().getName() + "\t
-----------发出通知");
            }

        }, "t2").start();
    }
}

 

上述对象Object使用的限制条件:

  • 线程需要先获得并持有锁,必须在锁块(synchronized或lock)中
  • 必须要先等待后唤醒,线程才能够被唤醒    

 

 

 方式二LockSupport类中的park等待和unpark唤醒:

  • 是什么
  •  

    • LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能,每个线程都有一个许可(Permit),许可证只能有一个,累加上限是1。
  • 主要方法
  •  

    • 阻塞:
      Peimit许可证默认没有不能放行,所以一开始调用park()方法当前线程会阻塞,直到别的线程给当前线程发放peimit,park方法才会被唤醒。
  •  

    •  

      • park/park(Object blocker)-------阻塞当前线程/阻塞传入的具体线程
  •  

    • 唤醒: 调用unpack(thread)方法后
      就会将thread线程的许可证peimit发放,会自动唤醒park线程,即之前阻塞中的LockSupport.park()方法会立即返回。
  •  

    •  

      • unpark(Thread thread)------唤醒处于阻塞状态的指定线程

/**
 * @author Guanghao Wei
 * @create 2023-04-11 12:13
 */
public class LockSupportDemo {

    public static void main(String[] args) {
        /**
         * t1     -----------come in
         * t2     ----------发出通知
         * t1     ----------被唤醒
         */
        Thread t1 = new Thread(() -> {
           
System.out.println(Thread.currentThread().getName() + "\t -----------come
in");
            LockSupport.park();
           
System.out.println(Thread.currentThread().getName() + "\t ----------被唤醒");
        }, "t1");
        t1.start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            LockSupport.unpark(t1);
           
System.out.println(Thread.currentThread().getName() + "\t
----------发出通知");
        }, "t2").start();

    }
}
 

  • 重点说明(重要)
  •  

    • LockSupport是用来创建锁和其他同步类的基本线程阻塞原语 
      ,所有的方法都是静态方法,可以让线程再任意位置阻塞,阻塞后也有对应的唤醒方法。归根结底,LockSupport时调用Unsafe中的native代码
    • LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞的过程
      ,LockSupport和每个使用它的线程都有一个许可(Peimit)关联,每个线程都有一个相关的permit,peimit最多只有一个,重复调用unpark也不会积累凭证。
    • 形象理解:线程阻塞需要消耗凭证(Permit),这个凭证最多只有一个
  •  

    •  

      • 当调用park时,如果有凭证,则会直接消耗掉这个凭证然后正常退出。如果没有凭证,则必须阻塞等待凭证可用;
      • 当调用unpark时,它会增加一个凭证,但凭证最多只能有1各,累加无效,所以多次 LockSupport.unpark(t1);

 

 

总结:

LockSupport中的unpark是通过给线程加一个原子通行证属性来判断线程有无使用;而使用锁,是依靠锁监视器对象来协调各个线程以及阻塞线程,包括锁对象的线程等待队列来管理线程状态

http://www.zskr.cn/news/20044.html

相关文章:

  • 护花使者
  • 实用指南:Kafka 合格候选主副本(ELR)在严格 min ISR 约束下提升选主韧性
  • 2025年10月石头纸设备定做厂家最新推荐榜单:诚信专业,品质卓越之选!
  • H5移动端图片查看器
  • 2025 年国内风化板源头厂家最新推荐排行榜:聚焦优质原料与精湛工艺,助力消费者精准选购靠谱企业榜单吧台/松木/桌面/茶台风化板厂家推荐
  • Delapp文件删除工具!Windows中删除文件和文件夹的简单工具!仅507KB的工具小巧且方便
  • 基于Hadoop+Spark的商店购物趋势分析与可视化平台科技达成
  • 2025 年折弯厂家推荐:江阴市富磊钢板加工专业中厚钢板折弯加工与高效行业解决方案提供商
  • 2025年10月振动电机厂家最新推荐排行榜,三相振动电机,单相振动电机,防爆振动电机公司推荐!
  • 【IEEE出版、连续6届已EI检索、多校联办】第七届机器人、智能控制与人工智能国际学术会议(RICAI 2025)
  • 企业数字化转型浪潮下,如何选择最适合的项目管理工具?
  • dify工作流遇到的问题及解决方案
  • 2025年10月青海视频号运营最新权威推荐榜:专业服务与创意内容引领潮流!
  • 2025年10月通风气楼厂家最新推荐排行榜,工业/商用通风气楼,高效节能通风解决方案提供商!
  • 工业状态控制
  • 2025 年磨粉机厂家最新推荐榜单:全面覆盖新型磨粉机、超细磨粉机、立式双动力磨粉机及节能磨粉机,为各行业采购者精准筛选优质品牌
  • 手把手教你在 Windows 安装 Docker Desktop
  • 强化学习的数学原理-04章 策略评估与策略优化 - 指南
  • HDU1204糖果大战 题解
  • 吴恩达深度学习笔记----系列文章
  • 2025年中国开发者代码管理平台选型全景报告:从本土化适配到全球化协作
  • 使用CVX工具箱求解凸优化问题示例
  • FastReport文本框根据高度缩小字体
  • 基于MATLAB的一维大地电磁反演程序实现
  • Java并发机制的底层实现原理:从CPU到JVM的全面解析
  • 学习unigui【38】重新认识UUNIGUI--为什么这样快? 站在“架构与性能”层面重新审视
  • 2025 年国内发电机厂家最新推荐排行榜:汽油 / 柴油 / 10KW-200KW 多功率机型精选,全方位解读品牌实力助力精准选购
  • IDA9.0中文版与相关插件安装详细教程
  • 2025 北京宽带安装公司最新推荐榜:专业口碑双优服务商汇总,企业家庭装机必看指南北京企业/北京无线/北京商务/北京商业/北京店铺宽带安装公司推荐
  • 2025年10月苹果仓源头厂家最新推荐榜单:专业仓储与高效配送的优质选择!