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. emqx的acl.conf使用

    allow_anonymous=true就不说了,打开这个就像开了挂 现在讨论一下allow_anonymous=false,这样的话你会发现,client连接不上了 后来发现连接和权限 是两个事.. ...

  2. 解决windows update失败,正在还原的问题

    其实这个不算问题,等上几个小时,还原完毕就好了,不过也有快速解决的办法. 所需工具:U盘.光盘等可以进入PE系统的工具,dism++软件 1.下载dism++工具,根据你的系统,选择使用32位还是64 ...

  3. VMware客户端vSphereClient新建虚拟机

    1.说明 VMware客户端工具vSphere Client, 用来连接和管理ESX或ESXi主机(下面称为宿主机), 可以方便的创建.管理虚拟机,并分配相应的资源.宿主机就是使用虚拟化软件运行虚拟机 ...

  4. CSS基础 装饰 元素本身隐藏和显示效果及案例

    1.visibility:hidden; 2.display: none: 区别: 1.visibility:hidden 隐藏元素本身,且在网页中 占位置 2.display:none; 隐藏元素本 ...

  5. 初识python:tkinter 实现 弹球小游戏(非面相对象)

    通过 tkinter 采用非面相对象式实现弹球小游戏(使用蹩脚式面相对象实现). #!/user/bin env python # author:Simple-Sir # time:2020/8/3 ...

  6. Gitlab如何进行备份恢复与迁移?

    https://blog.csdn.net/ouyang_peng/article/details/77070977 1.Gitlab 创建备份 1.1 创建备份文件 首先我们得把老服务器上的Gitl ...

  7. vim - 显示不可见字符(:set list)

    默认情况下,vim是不会显示space,tabs,newlines,trailing space,wrapped lines等不可见字符的.我们可以使用以下命令打开list选项,来显示非可见字符: : ...

  8. spring security 动态 修改当前登录用户的 权限

    1.前言 spring security 可以获取当前登录的用户信息,同时提供了接口 来修改权限列表信息 , 使用这个方法 ,可以动态的修改当前登录用户权限. 那么问题来了... 如果我是管理员 ,如 ...

  9. 深入了解mysql--gap locks,Next-Key Locks

    Next-Key Locks Next-Key Locks是在存储引擎innodb.事务级别在可重复读的情况下使用的数据库锁,官网上有介绍,Next-Key Locks是行锁和gap锁的组合.行锁是什 ...

  10. vue项目配置及代理解决跨域

    axios数据请求 1.下载模块:npm install axios 2.axios特点: 1.支持在浏览器当中发起XMLHttpRequest请求 2.支持Promise 3.自动转换json数据 ...