标签:导致 文章汇总 com class demo 基础 高并发 收录 试题
【原创】Java并发编程系列13 | LookSupport收录于话题
#进阶架构师 | 并发编程专题
12个
本文为何适原创并发编程系列第 13 篇,文末有本系列文章汇总。
java.util.concurrent 中源码频繁使用的 LockSupport 来阻塞线程和唤醒线程,如 AQS 的底层实现用到 LockSupport.park()方法和 LockSupport.unpark()方法。
LockSupport 到底是什么?同样是阻塞和唤醒线程为什么不用 Object 的 wait()/notify 方法?
LockSupport 提供 park()和 unpark()方法实现阻塞线程和解除线程阻塞。
阻塞线程:
每个 park 方法都对应有一个带有 Object 阻塞对象的重载方法。增加了一个 Object 对象作为参数,此对象在线程受阻塞时被记录,以允许监视工具和诊断工具确定线程受阻塞的原因。
唤醒线程:
void unpark(Thread thread):唤醒处于阻塞状态的指定线程
使用举例
public class LockSupportDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
LockSupport.park();
System.out.println("thread线程被唤醒");
});
thread.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(thread);
}
}
thread线程park阻塞。
主线程sleep3s之后,unpark(thread)。
thread被唤醒,输出"thread线程被唤醒"。
每个线程都会与一个许可关联,这个许可对应一个 Parker 的实例,Parker 有一个 int 类型的属性_count。
park()方法:
将_count 变为 0
如果原_count==0,将线程阻塞
unpark()方法:
将_count 变为 1
如果原_count==0,将线程唤醒
Object 的 wait()/notify 方法需要获取到对象锁之后在同步代码块里才能调用,而 LockSupport 不需要获取锁。所以使用 LockSupport 线程间不需要维护一个共享的同步对象,从而实现了线程间的解耦。
unark()方法可提前 park()方法调用,所以不需要担心线程间执行的先后顺序。
多次调用 unpark()方法和调用一次 unpark()方法效果一样,因为 unpark 方法是直接将_counter 赋值为 1,而不是加 1。
许可不可重入,也就是说只能调用一次 park()方法,如果多次调用 park()线程会一直阻塞。
参考资料
《Java并发编程之美》
《Java并发编程实战》
《Java并发编程的艺术》
【原创】01|开篇获奖感言
【原创】02|并发编程三大核心问题
【原创】03|重排序-可见性和有序性问题根源
【原创】04|Java 内存模型详解
【原创】05|深入理解 volatile
【原创】06|你不知道的 final
【原创】07|synchronized 原理
【原创】08|synchronized 锁优化
【原创】09|基础干货
【原创】10|线程状态
【原创】11|线程调度
【原创】12|揭秘CAS
———— e n d ————
金三银四,师长为大家准备了三份面试宝典:
《java面试宝典5.0》
《350道Java面试题:整理自100+公司》
《资深java面试宝典-视频版》
分别适用于初中级,中高级,以及资深级工程师的面试复习。
内容包含java基础、javaweb、各个性能优化、JVM、锁、高并发、反射、Spring原理、微服务、Zookeeper、数据库、数据结构、限流熔断降级等等。
获取方式:点“在看”,V信关注师长的小号:编程最前线并回复 面试 领取,更多精彩陆续奉上。
点在看好不好,喵~
【原创】Java并发编程系列13 | LookSupport
标签:导致 文章汇总 com class demo 基础 高并发 收录 试题
原文地址:https://blog.51cto.com/15009303/2552805