LockSupport

名词解释

LockSupport是一个在JUC包里的线程阻塞工具类,所有的方法都是静态方法,主要用途是让线程在任意位置阻塞,广泛应用在AQS和各种JUC的锁中。

代码

public static void threadOne(){
System.out.println("当前线程状态1:"+Thread.currentThread().getState()); //RUNNABLE
LockSupport.park();
System.out.println("当前线程状态3:"+Thread.currentThread().getState()); //RUNNABLE
} public void demo(){
Thread t1 = new Thread(LockSupportDemo::threadOne, "t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前线程状态2:"+t1.getState());//WAITING
try {
LockSupport.unpark(t1);
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前线程状态4:"+t1.getState());//TERMINATED
}

WaitAndNotify

名词解释

  • Wait

    wait()方法是object类的方法,解决的问题是线程间的同步,该过程包含了同步锁的获取和释放,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify()方法才会重新激活调用者。

注意:线程调用notify()之后,只有该线程完全从 synchronized代码里面执行完毕后,monitor才会被释放,被唤醒线程才可以真正得到执行权。

  • notify

    notify()方法是object类的方法,notify仅唤醒一个线程并允许它去获得锁,notifyAll是唤醒所有等待这个对象的线程并允许它们去获得对象锁。

wait()和notify()方法都需要同一个对象锁进行调用,否则将不会生效。

代码

public static void downLoad(){
//下载图片
for (int i = 0; i < 20; i++) {
try {
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("开始下载图片:"+(i*5+5)+"%");
} catch (InterruptedException e) {
e.printStackTrace();
} }
System.out.println("-----图片下载完毕----");
synchronized (object){
//进行唤醒
object.notify();
}
//下载附件
for (int i = 0; i < 20; i++) {
try {
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("开始下载附件:"+(i*5+5)+"%");
} catch (InterruptedException e) {
e.printStackTrace();
} }
System.out.println("-----附件下载完毕----");
} /**
* @Description: 图片展示
* @Author: zhuyang
* @Date: 2022/1/10 11:09
* @return: void
**/
public static void imgShow(){
synchronized (object){
try {
object.wait();
System.out.println("-----进行图片展示----");
System.out.println("-----图片展示完毕----");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void demo() throws InterruptedException {
Thread t1 = new Thread(WaitAndNotify::downLoad, "t1");
Thread t2 = new Thread(WaitAndNotify::imgShow, "t2");
t1.start();
t2.start();
t1.join(); }

LockSupport与wait()和notify()区别

①: wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,但是park不需要获取某个对象的锁就可以锁住线程。

②: notify只能随机选择一个线程唤醒,无法唤醒指定的线程,unpark却可以唤醒一个指定的线程。

Gitee地址

https://gitee.com/zhuayng/foundation-study/tree/develop/JavaBasis/JUC/src/main/java/com/yxkj/juc/c_000

LockSupport、wait()、notify()的更多相关文章

  1. 005-多线程-锁-JUC锁-LockSupport【使用、Unsafe、对比Object的wait、底层源码】

    一.概述 在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作.LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能 ...

  2. 高并发之Semaphore、Exchanger、LockSupport

    本系列研究总结高并发下的几种同步锁的使用以及之间的区别,分别是:ReentrantLock.CountDownLatch.CyclicBarrier.Phaser.ReadWriteLock.Stam ...

  3. wait、notify、sleep、interrupt对比分析

    对比分析Java中的各个线程相关的wait().notify().sleep().interrupt()方法 方法简述 Thread类 sleep:暂停当前正在执行的线程:(类方法) yield:暂停 ...

  4. 线程同步以及yield()、wait()、Notify()、Notifyall()

    一.线程同步 1.线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏. 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对 ...

  5. 关于synchronized、wait、notify已经notifyAll的使用

    前言:关于synchronized.wait.notify已经notifyAll大家应该不陌生,现在我大致说一下我的理解. 一:synchronized synchronized中文解释是同步,那么什 ...

  6. Java线程锁,synchronized、wait、notify详解

    (原) JAVA多线程这一块有点绕,特别是对于锁,对锁机制理解不清的话,程序出现了问题也很难找到原因,在此记录一下线程的执行以及各种锁. 1.JAVA中,每个对象有且只有一把锁(lock),也叫监视器 ...

  7. 【Java Concurrency】sleep()、wait()、notify()、notifyAll()的用法与区别

    >关于本文 本文介绍sleep().wait().notify().notifyAll()方法,主要要理解: sleep()和wait()的区别. wait()与notify().notifyA ...

  8. 005-线程sleep、join、yield、wait、notify、notifyAll、run、start、synchronized

    一.线程sleep join yield wait 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchroni ...

  9. JAVA多线程之Synchronized、wait、notify实例讲解

    一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...

随机推荐

  1. 【C\C++笔记】register寄存器关键字

    使用寄存器变量提高运行速度 1未使用寄存器组 #include<stdio.h> int main(){ unsigned long a=0; for(int i=0;i<10000 ...

  2. html2canvas 返回的toDataURL()数据为 data:,的解决方法

    1.使用的场景是把html转换成PDF保存下来,代码: /* eslint-disable */ import html2canvas from 'html2canvas'; import JsPDF ...

  3. HTMl+CSS 模仿京东网登录页面

    课后实践项目,仅页面效果,写博客纯属记录! 码云开源仓库地址:https://gitee.com/ynavc/jd 演示地址:https://ynavc.gitee.io/jd 效果图: 实现代码: ...

  4. 【MySQL作业】sum、max 和 min 聚合函数——美和易思聚合函数应用习题

    点击打开所使用到的数据库>>> 1.统计商品最高单价和最低单价. -- 获取所有商品的最高单价和最低单价: select max(unitPrice) 最高单价 , min(unit ...

  5. Linux 使用 split 命令分割文件

    使用方法: $ split --help 用法:split [选项]... [输入 [前缀]] 将输入内容拆分为固定大小的片段并输出到"前缀aa"."前缀ab" ...

  6. python 插入mysql数据库字符串中含有单引号或双引号报错

    出现问题场景:使用mysql数据库管理接口测试用例,新增接口用例时,传入的paras内容,有多层嵌套的时候,就会有["]双引号括住[']单引号的情况,可能在插入单双引号的数据到数据库的时候, ...

  7. linux(CentOS7) 之 zookeeper 下载及安装

    下载 搜索apache ,进入apache官网(https://www.apache.org/)下载 选择downloads 下的distribution 点击archive site 找到zooke ...

  8. django中的时区问题

    在django中设置时区,通过setting文件中的: TIME_ZONE = 'Asia/Shanghai' 开起多时区支持功能:USE_TZ=True 这时在数据库中插入的时间为UTC时间,当调用 ...

  9. idea 创建 springboot 模块报错-解决

    1.报错截图 2.解决 把 https://start.spring.io  换成  阿里镜像的即可 https://start.aliyun.com/

  10. Go语言系列之标准库path/filepath

    一.Path包 import "path" path实现了对斜杠分隔的路径进行操作的函数. func IsAbs(path string) bool // 判断是否是一个绝对路径 ...