LockSupport源码分析
LockSupport提供park()和unpark()方法实现线程阻塞和唤醒。底层实现是通过sun.misc.Unsafe的park和unpark。
关于sun.misc.Unsafe的说明请参见我的另外一篇博客。
核心就是通过一个信号量(permit)实现的,0阻塞,1继续执行。
park时可以指定blocker以及阻塞时长或者阻塞到什么时间点,通过UNSAFE.park第一个boolean参数决定,true指定时间,false指定时长。
可以先执行unpark,再执行part的时候发现之前unpark设置为1了,直接继续执行,并设置信号量为0。
park时除了unpark或者时间到了的情况外,阻塞的线程也会被其他线程调用该线程的interrupt方法中断并立即返回,
该过程不会抛出异常,所以调用者需要检查线程状态,是怎样的方式被唤醒的。
park的注释说明如下:
This method does <em>not</em> report which of these caused the
method to return. Callers should re-check the conditions which caused
the thread to park in the first place.
与wait的区别:
wait需要获取对象锁,LockSupport不需要;
wait挂起的是当前线程,属于随机性,唤醒notify,notifyAll也是随机的,LockSupport直接控制的是线程,指定线程park,指定线程unpark或interrupt
LockSupport源码分析的更多相关文章
- Java并发编程 LockSupport源码分析
这个类比较简单,是一个静态类,不需要实例化直接使用,底层是通过java未开源的Unsafe直接调用底层操作系统来完成对线程的阻塞. package java.util.concurrent.locks ...
- 【JUC】JDK1.8源码分析之LockSupport(一)
一.前言 最开始打算分析ReentrantLock,但是分析到最后,发现离不开LockSuport的支持,所以,索性就先开始分析LockSupport,因为它是锁中的基础,是一个提供锁机制的工具类,所 ...
- Java并发编程笔记之Unsafe类和LockSupport类源码分析
一.Unsafe类的源码分析 JDK的rt.jar包中的Unsafe类提供了硬件级别的原子操作,Unsafe里面的方法都是native方法,通过使用JNI的方式来访问本地C++实现库. rt.jar ...
- 【JUC】JDK1.8源码分析之AbstractQueuedSynchronizer(二)
一.前言 在锁框架中,AbstractQueuedSynchronizer抽象类可以毫不夸张的说,占据着核心地位,它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.所以很有必 ...
- 【JUC】JDK1.8源码分析之ReentrantLock(三)
一.前言 在分析了AbstractQueuedSynchronier源码后,接着分析ReentrantLock源码,其实在AbstractQueuedSynchronizer的分析中,已经提到过Ree ...
- 【JUC】JDK1.8源码分析之CyclicBarrier(四)
一.前言 有了前面分析的基础,现在,接着分析CyclicBarrier源码,CyclicBarrier类在进行多线程编程时使用很多,比如,你希望创建一组任务,它们并行执行工作,然后在进行下一个步骤之前 ...
- 【JUC】JDK1.8源码分析之SynchronousQueue(九)
一.前言 本篇是在分析Executors源码时,发现JUC集合框架中的一个重要类没有分析,SynchronousQueue,该类在线程池中的作用是非常明显的,所以很有必要单独拿出来分析一番,这对于之后 ...
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...
- Java显式锁学习总结之六:Condition源码分析
概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使con ...
随机推荐
- 矩阵-bzoj1898
This article is made by Jason-Cow.Welcome to reprint.But please post the article's address. BZOJ1898 ...
- 【安卓逆向】反编译ELF的另类技巧
IDA 反编译 ObjDump反编译 ObjDump是ndk环境自带的一个脚本,在android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebu ...
- laravel 事件系统
例子: 打开 VerificationController ,此控制器处理所有邮件认证相关逻辑: app/Http/Controllers/Auth/VerificationController.ph ...
- Yii2框架 常用函数整合
1.使用事务添加数据: public function create() { if($this->validate()) { $trans = Yii::$app->db->begi ...
- eclipse修改快捷键
eclipse修改快捷键 ctrl + shift + l查看快捷键 window -> preferences -> 搜索keys 鼠标点击以下五个表头,可以按照内容搜索 示例,选中Bi ...
- 吴裕雄 PYTHON 人工智能——基于MASK_RCNN目标检测(4)
import os import sys import random import math import re import time import numpy as np import tenso ...
- debug assertion failed问题解决
运行过程中出现上述问题,后来发现是vector越界问题....解决办法:不要越界就好了...
- Mybatis空指针
查询数据,返回的字段要在 resultMap 中定义, <resultMap id="BaseResultMap" type="com...." > ...
- 【PAT甲级】1098 Insertion or Heap Sort (25 分)
题意: 输入一个正整数N(<=100),接着输入两行N个数,表示原数组和经过一定次数排序后的数组.判断是经过插入排序还是堆排序并输出再次经过该排序后的数组(数据保证答案唯一). AAAAAcce ...
- MongoDB-1 入门
基础概念 MongoDB 是非关系型数据库,也就是nosql,存储json数据格式会非常灵活,要比mysql更好,同时也能为mysql分摊一部分的流量压力.另外呢,对于非事务的数据完全可以保存到Mon ...