上周五和周末,工作忙里偷闲,在看java cocurrent中也顺便再温故了一下Thread.interrupt和java 5之后的LockSupport的实现。
在介绍之前,先抛几个问题。
Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常?Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING?一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么?LockSupport.pa...
在上篇博客(【Java并发编程实战】—– AQS(二):获取锁、释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起;在释放锁后,需要唤醒该线程的继任节点lock方法,在调用acquireQueued():if (shouldParkAfterFailedAcquire(p, node) &&parkAndCheckInterrupt())interrupted = true;在acquireQueued()中调用parkAndCheckInterrupt()来挂起当前线程:private final boolean parkAndCheckInter...
目录
简介
构造函数,方法setBlocker,unpark,park,parkNanos,parkUtil
方法getBlocker,park,parkNanos,parkUtil,nextSecondarySeed
字段UNSAFE,parkBlockerOffset,SEED,PROBE,SECONDARY简介
package java.util.concurrent.locks;
import sun.misc.Unsafe;/*** 用于创建锁和其他同步类的基本线程阻塞原语。** <p>这个类与每个使用它的线程关联一个许可(某种意义上类似Semaphore)。* 如果许可证可用,对park的调用将立即返回,并在此过...
Java并发编程之LockSupport
简介: LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次调用park会变成block(因为permit为0了,会阻塞在这里,直到permit变为1),...
介绍
LockSupport 工具类的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。LockSupport 类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport 类的方法的线程是不持有许可证的。LockSupport 是使用Unsafe 类实现的。
主要函数
static void park()
如果调用park 方法的线程已经拿到了与LockSupport 关联的许可证,则调用LockSupport.park() 时会马上返回,否则调用线程会被禁止参与线程的调度,也...
LockSupport工具类
? JDK 中的jr.jar包里面的LockSupport是个工具类,主要作用是挂起和唤醒线程
? LockSupport类与每个使用它的线程都会关联一个许可证(锁),在默认情况下调用时是不具有许可证的方法
功能void park()
如果没有许可证,挂起void unpark(Thread thread)
thread线程立即获取许可证,如果当前状态为被阻塞,立即唤醒void parkNanos(long nanos)
如果没有许可证,挂起nanos微秒park(Object blocker)
将blocker变量存放到调用...
LockSupport工具
LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。
LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思,假设线程为车辆,那么park方法代表着停车,而unpark方法则是指车辆启动离开,这些方法以及描述如下表。
LockSupport提供的阻塞和唤醒方法:在Jav...
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871805.htmlJava线程--LockSupport使用public static void main(String[] args) {/*** 阻塞当前线程 , 暂停调度, 响应中断* 获取锁失败也一直阻塞, 直到拿到锁*/LockSupport.park();/*** 阻塞当前线程, 超时自动释放*/LockSupport.parkNanos(0);/*** 阻塞当前线程, 超时自动释放*/LockSupport.parkUntil(0);/*** 释放当前线程*/LockSupport.unpark(null);/*** L...
java并发LockSupport
LockSupport是阻塞和唤醒线程的重要类。
park()方法使得当前线程阻塞
unpark(Thread thread)唤醒线程
例子
可以把注释取消再执行,就会发现park()方法使得当前线程阻塞会使得main线程阻塞,无法结束。
package com.java.javabase.thread.base.concurrent.lock;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.LockSupport;@Slf4j
public class LockSupportTest {/*** @author* @version*...
LockSupport
LockSupport类是一个工具类,用来在显示锁里面替换Object类的wait、notify方法的。在内置锁里面,wait方法必须在线程持有锁的时候才能对线程进行阻塞,但是LockSupport类却不一样,即使线程没有持有锁,它也能将该线程阻塞,它有两个重要的方法,但是底层的实现是由Unsafe类来实现的,也就是说,是由JVM来实现的:
public static void park() {UNSAFE.park(false, 0L);}
public static void unpark(Thread thread)...