转载请注明出处: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的更多相关文章

  1. java 锁!

    问题:如何实现死锁. 关键: 1 两个线程ta.tb 2 两个对象a.b 3 ta拥有a的锁,同时在这个锁定的过程中,需要b的锁:tb拥有b的锁,同时在这个锁定的过程中,需要a的锁: 关键的实现难点是 ...

  2. Java的LockSupport.park()实现分析(转载)

    LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: p ...

  3. 自己动手写java锁

    1.LockSupport的park和unpark方法的基本使用,以及对线程中断的响应性 LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语.java锁和同步器 ...

  4. java锁的种类以及辨析(转载)

    java锁的种类以及辨析(一):自旋锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我 ...

  5. Java锁--公平锁

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3496147.html 基本概念 本章,我们会讲解“线程获取公平锁”的原理:在讲解之前,需要了解几个基本概 ...

  6. Java锁--框架

    根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁". 同步锁 即通过synchronized关键字来进行同步,实现对竞争资源 ...

  7. Java线程--LockSupport使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871805.html Java线程--LockSupport使用 public static ...

  8. 硬核剖析Java锁底层AQS源码,深入理解底层架构设计

    我们常见的并发锁ReentrantLock.CountDownLatch.Semaphore.CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁. 上篇 ...

  9. Java锁(一)之内存模型

    想要了解Java锁机制.引发的线程安全问题以及数据一致性问题,有必要了解内存模型,机理机制了解清楚了,这些问题也就应声而解了. 一.主内存和工作内存 Java内存模型分为主内存和工作内存,所有的变量都 ...

随机推荐

  1. PHP反射API的使用、体会、说明

    最近开发支付宝相关功能的时候,由于支付宝的SDK比较落伍,不支持composer的方式加载,使用三方的composer SDK又觉得不放心 为了简化代码的调用方式,使用PHP的反射类针对支付宝官方SD ...

  2. 用gcd库函数求最大公约数

    如何直接调用库函数来求最大公约数呢? 1.首先看怎样求两个数的最大公约数 要注意gcd()前面是两个“_” !!! #include<bits/stdc++.h> using namesp ...

  3. nvm 相关命令

    nvm install 安装指定版本,可模糊安装,如:安装v10.4.0,既可nvm install v10.4.0,又可nvm install 4.4 nvm uninstall 删除已安装的指定版 ...

  4. 2、head 标签学习

     5秒自动刷新 <meta http-equiv="refresh" content="5,url:http://www.baidu.com" /> ...

  5. 路由器01---k2刷Pandora

    1.固件 固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序. 对于独立可操作的电子产品,固件一般指它的操作系统(“担任着一个数码产品 ...

  6. react项目中canvas之画形状(圆形,椭圆形,方形)

    组件DrawShape.jsx如下: import React, { Component } from 'react' // import ClassNames from 'classnames' i ...

  7. Abandoning Roads CodeForces - 1149D (最小生成树)

    大意: 给定无向图, 边权只有两种, 对于每个点$x$, 输出所有最小生成树中, 点$1$到$x$的最短距离. 先将边权为$a$的边合并, 考虑添加边权为$b$的边. 每条路径只能经过每个连通块一次, ...

  8. mysql查看表结构命令,如下:

    desc 表名; show columns from 表名; describe 表名; show create table 表名;

  9. sys.dm_exec_query_stats的total_worker_time的单位是微秒还是毫秒

    该视图sys.dm_exec_query_stats存放的就是当前所有执行计划的详细信息,比如某条执行计划共占CPU多少等等.因为该视图对编译次数.占用CPU资源总量.执行次数等都进行了详细的记录,所 ...

  10. 通过Kubeadm搭建Kubernetes集群

    历经断断续续学习的两天,终于完成了一个简单k8s集群. 参考 https://www.cnblogs.com/edisonchou/p/aspnet_core_on_k8s_deepstudy_par ...