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. scrum回顾_Scrum和SAFe之间有什么不同
  2. 过去一百年那些“被打脸”的科技预言
  3. 在windows下安装flex和bison、GCC
  4. centos7下使用yum安装pip
  5. How to sign app
  6. 解决 error: command 'swig' failed with exit status 1
  7. php jquery 局部页面刷新,jQuery页面刷新(局部、全部)问题分析_jquery
  8. 解决permission denied错误
  9. 彩色图像和灰色图像的区别
  10. 原创 基于微信小程序毕业设计题目选题课题 自习室图书馆座位预约小程序的设计与实现(2)座位预约的实现
  11. CI、CD、Pipeline 概念
  12. Win11电脑蓝屏怎么办?Win11电脑蓝屏的修复方法
  13. (三万字长文)类型即正义:TypeScript 从入门到实践系列,正式完结!
  14. O2O新猜想:如果商家这样做,还需要团购平台吗
  15. 【雕爷学编程】Arduino动手做(76)---2路光耦继电器模块
  16. c语言音频信号频谱分析,音频信号频谱分析(正文)-副本.pdf
  17. 十分钟实现鼠标悬停效果,CSS3悬停效果
  18. 2021年二季度重大舆情热点盘点分析
  19. mysql 调用方差函数_mysql 函数大全
  20. 《iOS用户体验》总结与思考-修改版

热门文章

  1. SAS——编程——数学
  2. cf 834 E. Ever-Hungry Krakozyabra
  3. 图形学课设 塔防游戏
  4. 遇见爱你的人会治愈你的童年阴影
  5. pandas 第十二期组队-pandas基础
  6. 将实验数据用matlab连成平滑的曲线图
  7. 基于RV1126 Video分析-----mipi dphy模块所代表的subdev子设备注册
  8. 2019年7月31日18:57:48
  9. Kratos,RPC服务调用过程
  10. 邵雍·《渔樵问对》译文和原文