Java锁--LockSupport
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3505784.html
LockSupport介绍
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。
LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。
因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。
LockSupport函数列表

// 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。
static Object getBlocker(Thread t)
// 为了线程调度,禁用当前线程,除非许可可用。
static void park()
// 为了线程调度,在许可可用之前禁用当前线程。
static void park(Object blocker)
// 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。
static void parkNanos(long nanos)
// 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。
static void parkNanos(Object blocker, long nanos)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static void parkUntil(long deadline)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static void parkUntil(Object blocker, long deadline)
// 如果给定线程的许可尚不可用,则使其可用。
static void unpark(Thread thread)

LockSupport参考代码(基于JDK1.7.0_40)
LockSupport.java的源码如下:
说明:LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。
LockSupport示例
对比下面的“示例1”和“示例2”可以更清晰的了解LockSupport的用法。
示例1

1 public class WaitTest1 {
2
3 public static void main(String[] args) {
4
5 ThreadA ta = new ThreadA("ta");
6
7 synchronized(ta) { // 通过synchronized(ta)获取“对象ta的同步锁”
8 try {
9 System.out.println(Thread.currentThread().getName()+" start ta");
10 ta.start();
11
12 System.out.println(Thread.currentThread().getName()+" block");
13 // 主线程等待
14 ta.wait();
15
16 System.out.println(Thread.currentThread().getName()+" continue");
17 } catch (InterruptedException e) {
18 e.printStackTrace();
19 }
20 }
21 }
22
23 static class ThreadA extends Thread{
24
25 public ThreadA(String name) {
26 super(name);
27 }
28
29 public void run() {
30 synchronized (this) { // 通过synchronized(this)获取“当前对象的同步锁”
31 System.out.println(Thread.currentThread().getName()+" wakup others");
32 notify(); // 唤醒“当前对象上的等待线程”
33 }
34 }
35 }
36 }

示例2

1 import java.util.concurrent.locks.LockSupport;
2
3 public class LockSupportTest1 {
4
5 private static Thread mainThread;
6
7 public static void main(String[] args) {
8
9 ThreadA ta = new ThreadA("ta");
10 // 获取主线程
11 mainThread = Thread.currentThread();
12
13 System.out.println(Thread.currentThread().getName()+" start ta");
14 ta.start();
15
16 System.out.println(Thread.currentThread().getName()+" block");
17 // 主线程阻塞
18 LockSupport.park(mainThread);
19
20 System.out.println(Thread.currentThread().getName()+" continue");
21 }
22
23 static class ThreadA extends Thread{
24
25 public ThreadA(String name) {
26 super(name);
27 }
28
29 public void run() {
30 System.out.println(Thread.currentThread().getName()+" wakup others");
31 // 唤醒“主线程”
32 LockSupport.unpark(mainThread);
33 }
34 }
35 }

运行结果:
main start ta
main block
ta wakup others
main continue
说明:park和wait的区别。wait让线程阻塞前,必须通过synchronized获取同步锁。
Java锁--LockSupport的更多相关文章
- java 锁!
问题:如何实现死锁. 关键: 1 两个线程ta.tb 2 两个对象a.b 3 ta拥有a的锁,同时在这个锁定的过程中,需要b的锁:tb拥有b的锁,同时在这个锁定的过程中,需要a的锁: 关键的实现难点是 ...
- Java的LockSupport.park()实现分析(转载)
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: p ...
- 自己动手写java锁
1.LockSupport的park和unpark方法的基本使用,以及对线程中断的响应性 LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语.java锁和同步器 ...
- java锁的种类以及辨析(转载)
java锁的种类以及辨析(一):自旋锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我 ...
- Java锁--公平锁
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3496147.html 基本概念 本章,我们会讲解“线程获取公平锁”的原理:在讲解之前,需要了解几个基本概 ...
- Java锁--框架
根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁". 同步锁 即通过synchronized关键字来进行同步,实现对竞争资源 ...
- Java线程--LockSupport使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871805.html Java线程--LockSupport使用 public static ...
- 硬核剖析Java锁底层AQS源码,深入理解底层架构设计
我们常见的并发锁ReentrantLock.CountDownLatch.Semaphore.CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁. 上篇 ...
- Java锁(一)之内存模型
想要了解Java锁机制.引发的线程安全问题以及数据一致性问题,有必要了解内存模型,机理机制了解清楚了,这些问题也就应声而解了. 一.主内存和工作内存 Java内存模型分为主内存和工作内存,所有的变量都 ...
随机推荐
- CDH建表字符集问题
登陆metadata数据库: show variables like 'character_set%'; alter database hivemeta default character set l ...
- todo---jaxen
- oracle经典查询语句
1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 ...
- python学习-26 函数作用域
举例说明: 1. name = 'john' def foo(): name = 'xiaomming' def bar(): print(name) return bar a=foo() print ...
- Python开发【第三章】:编码转换
一.字符编码与转码 1.bytes和str 之前有学过关于bytes和str之间的转换,详细资料->bytes和str(第四字符串) 2.为什么要进行编码和转码 由于每个国家电脑的字符编码格式不 ...
- 跟我一起学编程—《Scratch编程》第22课:颠弹力球
1. 能够熟练绘制角色和背景造型 2. 能够熟练控制角色角度.速度等 3. 能够熟练使用变量 4. 能够熟练使用循环.选择等指令控制程序 任务描述: 1. 绘制弹力小球.托板角色,背景造型. 2. 游 ...
- CSS定位以及z-index属性(层叠性)的详解(转)
https://blog.csdn.net/weixin_41342585/article/details/79484879
- CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败
今天在使用 C# 操作 Excel 时,一直在报错误: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下 ...
- Mysql、Navicat Premium 12连接
1.配置MySQL80的环境 安装好MySQL,为MySQL配置环境变量.MySQL默认安装在C:\Program Files下. 1)新建MYSQL_HOME变量,并配置:C:\Program Fi ...
- luogu题解P1967货车运输--树链剖分
题目链接 https://www.luogu.org/problemnew/show/P1967 分析 NOIp的一道裸题,直接在最大生成树上剖分取最小值一下就完事了,非常好写,常数也比较小,然而题解 ...