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. R语言使用dplyr将特定的数据列移动到最前面、使用dplyr将特定数据列移动到另一指定数据列的后面、使用dplyr将特定数据列移动到另一指定数据列的前面
  2. mass Framework emitter模块
  3. Django实战(20):分页(Pagination)
  4. jquery链式写法 java_jQuery链式操作
  5. 使用ajax方法实现form表单的提交
  6. Virut样本取证特征
  7. map在Java集合_java集合之Map
  8. 教大家如何制作优盘启动盘
  9. CentOS 6.5设置静态IP教程 并且可以ping通
  10. Android中的文字占位符
  11. AI 脑补宋明清皇帝长相,四大模型构想真实五官
  12. 云南昭通暴雨强度公式_最新玉溪市中心城区暴雨强度公式(修订)
  13. [个人小记]U盘文件超过4g怎么办?
  14. [听风]TBC炼金速冲1-375
  15. 计算机网络重要知识点
  16. 多媒体个人计算机能处理什么,多媒体信息处理
  17. 拉格朗日松弛求解问题
  18. [SVA]SystemVerilog Assertion(SVA)編寫經驗
  19. python中汉诺塔如何理解_python汉诺塔问题的递归理解
  20. openlayers 绘制包络线

热门文章

  1. oracle date类型字段,Oracle Date类型
  2. 2020中国高校计算机大赛网络技术挑战赛,风起云涌!2020 “中国高校计算机大赛-网络技术挑战赛”总决赛即将在浙南科技城开赛...
  3. 微信小程序定义公共方法
  4. linux下dhcp服务器分配出去的IP地址及剩余IP地址
  5. 如何利用SQLyog数据库管理工具生成各表的关系视图
  6. 机器学习_深度学习毕设题目汇总——交通
  7. Revit 浏览器组织
  8. strtod() 函数
  9. Linux——磁盘分区与挂载
  10. 神威OpenFOAM——最流行的开源CFD软件与神威·太湖之光的珠联璧合