首页 > 其他分享 > 【打怪升级】【juc】关于LockSupport

【打怪升级】【juc】关于LockSupport

时间:2023-04-02 23:34:53浏览次数:44  
标签:juc park LockSupport 升级 unpark 线程 唤醒 wait

通过juc下LockSupport,可以达到阻塞和唤醒线程的操作

 

  • LockSupport

  LockSupport是juc下一个线程阻塞唤醒的工具类。它的主要方法有:

    

  每个使用LockSupport的线程,会有一个许可;调用park会立即返回,否则会被阻塞。

  如果许可不可用,则可以调用unpark供其可使用,但是许可不可重入,例如在park()后接着park(),这样做可能会导致线程永远无法唤醒。

  对于park和unpark来说,它们本身就是一个阻塞和唤醒的实现,但是值得注意的是,一个线程的最大许可只会有一个。

  

  unpark:对于已经开始的线程,设置一个许可,对于未开始的线程可能不会有效果。

  park:如果当前线程许可>0 ,那么会继续执行,否则就会阻塞等待。什么时候会被唤醒?调用unpark对当前线程,或interrupt当前线程。

  所以,park在业务中 我们尽量保证将线程放在循环中,并前置校验当前的状态。

 

  • wait/notify

public final native void wait(long timeout) throws InterruptedException;
 
public final void wait() throws InterruptedException
 
public final void wait(long timeout, int nanos) throws InterruptedException

  首先说说wait,wait提供了几种重载方法,最终都会执行wait(time)的方法,它是属于Object包下的,调用它会导致当前线程阻塞,直到其他线程调用notify、notifyAll或等待执行时间自动唤醒,并且wait必须在同步块中使用,而且会释放锁。

  notify,用于唤醒wait的线程,如果没有wait的线程则会忽略,并且唤醒的线程会重新获取锁。notifyAll会唤醒所有持有相同的锁的阻塞线程同时唤醒进行竞争消费。

  但是这里又有wait和sleep的区别:

  wait sleep都可以让线程阻塞,并且都可被中断。

  sleep是Thread下的方法,而wait是Object的 而且wait比如在同步代码块中执行。

  sleep时,并不会释放锁,而wait会释放锁。

  sleep在指定时间后会主动退出,而wait如果不设置时间自动唤醒会一直阻塞。

  

 

  • interrupt

  如何在一个线程中暂停另一个线程的运行?

  stop方法?stop已经被禁用,因为stop是强行终止挂起线程,但是这种方式是很危险的,比如线程还没来得及释放锁,那其他线程将永远获取不到资源。

  所以我们要使用interrupt, 它不会像stop一样中断一个正在运行的线程,而线程会执行下去,但会设置线程中的中断状态,线程会一直检测这个标记量以判断线程是否需要被立即终止。

  但是,如果在一个阻塞线程中使用interrupt, 会产生一个InterruptedException异常,结束线程的运行。如果我们自定义捕获异常后,可以做一些额外工作,如终止、继续等

  所以,interrupt一般用在线程中的循环中,控制线程中断的状态。

 

  • LockSupport和wait

  经过上文介绍,我们对wait、notify和LockSupport有了基本的认识。那我们推荐使用哪种方式呢?

  举个例子,例如线程B要通知线程A唤醒,那么前置条件是什么?是要确保线程A必须开始并且持有相同的锁并且已经被阻塞了。那么如果线程A这时候没有达到这个条件,而后续达到了这个条件,那么线程B在notify时无法唤醒线程A,而线程A可能也面临永远无法唤醒的情况。那这种情况如果用LockSupport去处理会有什么好处呢?如果我们用park、unpark,那么在线程启动后,如果unpark在前,那么会在线程中添加一个许可,最大也只能有一个许可,这时如果达到了park条件,发现已经有许可就会继续执行;而如果线程先被park,那就会阻塞,直到被unpark唤醒。

  但是这里需要注意一个问题,如果我们多次park会怎么样?如果我们又unpark了多次会怎么样?

  其实对于LockSupport来说,park和unpark其实就是重置了内部的一个count,调用park会将count重置为0,那么如果重置之前是1,则直接退出,否则就被阻塞;调用unpark时,会将count重置为1,那么如果重置之前是0就将线程唤醒,否则直接退出。

  所以,如果我们多次park和unpark后,会导致线程无法被唤醒。

  推荐先park、后unpark。

  

  

  

  

标签:juc,park,LockSupport,升级,unpark,线程,唤醒,wait
From: https://www.cnblogs.com/oldEleven/p/17281783.html

相关文章

  • abp(net core)+easyui+efcore实现仓储管理系统——ABP升级7.3下(五十九)
    Abp(netcore)+easyui+efcore实现仓储管理系统目录abp(netcore)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)abp(netcore)+easyui+efcore实现仓储管理系统——解决方案介绍(二)abp(netcore)+easyui+efcore实现仓储管理系统——领域层创建实体(三) abp(netcore)+eas......
  • VSCode升级语言插件后界面变回英文,如何切换回中文
    按快捷键Ctrl+Shift+P,输入ConfigureDisplayLanguage回车后选择简体中文重启VSCode后生效 参考:VScode:将VScode界面的显示语言改为简体中文,切换VScode界面的显示语言......
  • 使用vSphere Update Manager 升级 ESXi 主机
    使用vSphereUpdateManager升级ESXi主机vSphereUpdateManager vSphereUpdateManager 是用于升级、迁移、更新和修补群集主机、虚拟机和客户机操作系统的软件。 vSphereUpdateManager 可协调主机和虚拟机的升级。如果站点使用 vSphereUpdateManager,VMware建议......
  • aspnet core系统优雅停机升级
    web项目在生产环境要求:停机时需要确保running的请求能被安全处理完毕停机时确保不接收新的请求需要有healthCheck接口Loadbalancer能对接healthCheck接口,确保业务能达到zerodowntimeupdate实现机制:文章:Simplezero-downtimeupdateswithASP.NETCorea......
  • Thinkpad T14升级Windows11ver22h2失败问题解决小记
    背景手头的ThinkPad在近一年的时间里每次升级Windows11的22h2版本每次都会报错,具体有以下几种情况:更新过程中无问题,重启后黑屏更新过程中会卡在26%左右,然后蓝屏报KENERAL_CHECK_FAIL,接着便自动重启进入修复程序在WindowsUpdate更新中报错0xC1900101在上述错误出现后,再次更......
  • ubuntu16.04升级python3.7.1教程
    ubuntu16.04升级python3.7.1教程准备sudoapt-getinstall--reinstallzlibczlib1gzlib1g-devsudoapt-getinstalllibffi-devlibssl-devlibreadline-dev-y安装使用python官方站点的以下命令下载Python。您也可以下载最新版本代替下面指定的版本#下载python3......
  • Dubbo服务提供者如何优雅升级?
    文章首发于公众号:BiggerBoy。欢迎关注。往期文章推荐大坑!隐式转换导致索引失效...高性能分布式限流:Redis+Lua真香!MySQL索引知识点&常见问题汇总联合索引在B+树上的存储结构及数据查找方式Redis分布式锁实战Mybatis第三方PageHelper插件分页原理MySQL索引底层原理 一、问题交......
  • xmind升级成pro
    Xmind8update9破解1、下载并安装xmind-8-update9-windows.exe2、下载破解文件XMindCrack.jar将此文件放到XMind安装路径下3、修改XMind.ini文件打开安装路径下的C:\ProgramFiles(x86)\XMind\XMind.ini文件,最后添加一行-javaagent:C:\ProgramFiles(x8......
  • 界面组件DevExpress WPF v22.2 - 工具栏、日程组件全新升级
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • 高效率低能耗干法超细研磨与分散技术升级,威海圆环氮化硅磨介圈一鸣惊人
    高效率低能耗干法超细研磨与分散技术升级,威海圆环行业首推氮化硅磨介圈干法研磨,业内通常是指以气流磨、搅拌磨、行星磨、球磨等机械研磨物理粉粹含水量不超过4%的物料以制备......