park和unpark方法详解

基于许可的多线程控制介绍

为了控制多个线程访问共享资源 ,我们需要为每个访问共享区间的线程派发一个许可。拿到一个许可的线程才能进入共享区间活动。当线程完成工作后,离开共享区间时,必须要归还许可,以确保后续的线程可以正常取得许可。如果许可用完了,那么线程进入共享区间时,就必须等待,这就是控制多线程并行的基本思想。

park和unpark方法

park和unpark方法是工具类LockSuppor介绍t中的API,它的作用很简单,就是挂起和继续执行线程。

public static void park()  // 表示让线程暂停
public static void unpark(Thread thread) // 表示让线程继续执行,恢复 暂停线程对象的运行

关于park和unpark方法执行先后顺序

LockSupport.unpark(Thread.currentThread());
LockSupport.park();

在park()之前,先执行了unpark(),进而释放了一个许可,也就是说当前线程有一个可用的许可。而park()在有可用许可的情况下,是不会阻塞线程的。

LockSupport.park();
LockSupport.unpark(Thread.currentThread());

先执行park(),获取许可证,然后执行unpark()释放了一个许可,并不会发生线程阻塞。

park()和unpark()的执行效果和它调用的先后顺序没有关系。这一点相当重要,因为在一个多线程的环境中,我们往往很难保证函数调用的先后顺序(都在不同的线程中并发执行),因此,这种基于许可的做法能够最大限度保证程序不出错。

与Object的wait和notify对比

wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必

park & unpark 是以线程为单位来阻塞和唤醒线程,而 notify 只能随机唤醒一个等待线程,notifyAll是唤醒所有等待线程,就不那么【精确】

park & unpark 可以先 unpark,而 wait & notify 不能先 notify

park和unpark原理

park和unpark会调用Unsafe类中的native方法

每个线程都会和一个park对象关联起来,由三部分组成 _counter , _cond 和 _mutex。核心部分是counter,我们可以理解为一个标记位。

当调用park时会看counter是否为0,为0则进入阻塞队列。为1则继续运行并将counter置为0。

当调用unpark时,会将counter置为1,若之前的counter值为0,还唤醒阻塞的线程。

park和unpark方法详解相关推荐

  1. Java LockSupport以及park、unpark方法源码深度解析

    介绍了JUC中的LockSupport阻塞工具以及park.unpark方法的底层原理,从Java层面深入至JVM层面. 文章目录 1 LockSupport的概述 2 LockSupport的特征和 ...

  2. 【面试:并发篇09:多线程:interrupt 方法详解】

    [面试:并发篇09:多线程:interrupt 方法详解] 00.前言 如果有任何问题请指出,感谢. 01.介绍 程序中,有些线程的中断需要外部干预,比如线程中存在while(true)循环,或者存在 ...

  3. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

  4. python修改文件内容_Python批量修改文本文件内容的方法详解

    这篇文章主要介绍了Python批量修改文本文件内容的方法的相关资料,需要的朋友可以参考下 Python批量替换文件内容,支持嵌套文件夹 import os path="./" fo ...

  5. python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)

    如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  6. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  7. golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...

    Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 pa ...

  8. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

  9. linux expect 输入密码,shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从 ...

最新文章

  1. WINCE6.0 chain.bin和xipkernel.bin解析
  2. Request的学习笔记(属Servlet学习课程)
  3. 《MySQL——count()逻辑》
  4. 大数问题(C++、Java)
  5. 角色和权限Hibernate实体映射配置
  6. 云上自动化 vs 云上编排
  7. Spring Boot 在Gradle构建中使用Log4j日志
  8. kotlin 运算符_Kotlin属性,数据类型,运算符
  9. H5使用OCR身份证识别
  10. html中vid中的id,VID/DID/SVID/SSID
  11. [C++] 开灯问题(两个思路)
  12. 电脑桌面云便签怎么绑定和开启微信提醒?
  13. win10自带邮箱客户端登录163邮箱:无法访问该账户,需要更新密码或授权码
  14. 【报告分享】德勤:2023中国消费者洞察与市场展望.pdf(附下载链接)
  15. 择偶标准与黑名单了解一下
  16. Volatile 和 CAS 的弊端之总线风暴
  17. 1275配对碱基链 1852玛雅文字 +map讲解 (map)
  18. 联想M7250打印机硒鼓清零
  19. 提高组模拟试题七第二试 佐佐小次郎
  20. 贝尔华为OLT业务替换方案

热门文章

  1. 修改mmsegmentation框架(deeplabV3+中加入注意力机制)
  2. C语言之结构体及位段
  3. ENVI基础--入门学习
  4. 悄悄送你几个黑科技资源网站 赶紧收藏起来
  5. getchar和putchar函数详解
  6. 第一本书 第九章 使用对象吃货联盟
  7. 一键seo提交收录_关于SEO行业中的某些信息,你究竟应该相信谁?又或者谁都不要信!...
  8. 星号构成的倒立直角三角形图案
  9. visio中如何画无箭头直线
  10. vue项目中导入视频