LockSupport

一、是什么

● LockSupport是用来实现线程的阻塞和唤醒。

● 主要内部方法是 park() 和 unpark() ,分别是阻塞线程和解除阻塞线程。

二、作用

为了替换掉jdk自带的wait-notify等待唤醒机制(wait-notify 只能结合synchronized使用,并且只能唤醒一个或全部唤醒,不够灵活)

三、使用

park() 阻塞当前线程

unpark(thread) 解除指定线程,注意需要传递参数,指定线程。

注意:

● 同一个线程最多只能持有一个许可,也就是进行多次unpark也只有一次park机会。

● 可以先unpark()再park()

下面用顺序打印ABC的代码来掌握park()和unpark()的使用:

java 复制代码
package threadpool.threadPrint;

import java.util.concurrent.locks.LockSupport;

/**
 * 顺序打印ABC
 */
public class ThreadPrint02 {

    private void printA(Thread thread) {
        System.out.println("A");
        LockSupport.unpark(thread);
    }

    private void printB(Thread thread) {
        LockSupport.park();
        System.out.println("B");
        LockSupport.unpark(thread);
    }

    private void printC() {
        LockSupport.park();
        System.out.println("C");
    }

    public static void main(String[] args) {

		/* 无论下面哪个线程先被执行,当B和C未获得它们的许可时,都会被阻塞掉,一直到获得许可。
		   或者,它们在它们执行顺先前面的线程执行完后,先给了它们许可后,它们再在park时,再消费此许可
		   这样就可以保证它们的打印顺序
		   LockSupport的存在目的就是为了替换掉jdk自带的wait-notify等待唤醒机制(它只能结合synchronized使用,并且只能唤醒一个或全部唤醒,不够灵活) */

        ThreadPrint02 testABC = new ThreadPrint02();

        Thread tC = new Thread(() -> {
            testABC.printC();
        });

        Thread tB = new Thread(() -> {
            testABC.printB(tC);
        });

        Thread tA = new Thread(() -> {
            testABC.printA(tB);
        });

        tC.start();
        tB.start();
        tA.start();
    }

}
相关推荐
多米Domi0111 分钟前
0x3f 第43天 黑马点评全量复习一遍 + 栈两题
开发语言·数据结构·python·算法·leetcode
码农水水8 分钟前
京东Java面试被问:分布式会话的一致性和容灾方案
java·开发语言·数据库·分布式·mysql·面试·职场和发展
白小筠10 分钟前
迭代器与生成器
开发语言·python
郝学胜-神的一滴11 分钟前
Linux网络字节序详解:从理论到实践
linux·服务器·c语言·开发语言·c++·网络协议·程序人生
indexsunny17 分钟前
互联网大厂Java求职面试实录:Spring Boot微服务在电商场景中的应用及技术深度解析
java·数据库·spring boot·缓存·微服务·面试·电商
夏幻灵18 分钟前
Java中的this关键字解析与应用
java·开发语言·python
移幻漂流18 分钟前
JNI的本质解析:Android Framework视角下的Java-Native衔接机制
android·java·开发语言
猿小羽21 分钟前
Spring AI + MCP 实战:构建下一代智能 Agent 应用
java·spring boot·llm·ai agent·spring ai·mcp·model context protocol
baivfhpwxf202322 分钟前
C# Task.Run 和 Task.Factory.StartNew 的区别
开发语言·c#
难得的我们27 分钟前
C++中的状态模式
开发语言·c++·算法