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. Python基础入门(9)- Python文件操作

    1.文件的读写 1.1.文件的创建与写入 利用内置函数open获取文件对象 文件操作的模式之写入 文件对象的操作方法之写入保存 1 # coding:utf-8 2 3 import os 4 5 c ...

  2. 数据可视化 gojs 简单使用介绍

    目录 1. gojs 简介 2. gojs 应用场景 3. 为什么选用 gojs: 4. gojs 上手指南 5. 小技巧(非常实用哦) 6. 实践:实现节点分组关系可视化交互图 最后 本文是关于如何 ...

  3. 生成对抗网络GAN与DCGAN的理解

    作者在进行GAN学习中遇到的问题汇总到下方,并进行解读讲解,下面提到的题目是李宏毅老师机器学习课程的作业6(GAN) 一.GAN 网络上有关GAN和DCGAN的讲解已经很多,在这里不再加以赘述,放几个 ...

  4. 使用docker或者docker-compose部署Zookeeper集群

    之前有介绍过Zookeeper的安装部署(Zookeeper基础教程(二):Zookeeper安装),但是那里我是基于独立的虚拟机来实现部署的,这种部署方式适合线上集群部署.后来有几次想用一下Zook ...

  5. Android 悬浮窗 System Alert Window

    悬浮窗能显示在其他应用上方.桌面系统例如Windows,macOS,Ubuntu,打开的程序能以窗口形式显示在屏幕上. 受限于屏幕大小,安卓系统中主要使用多任务切换的方式和分屏的方式.视频播放,视频对 ...

  6. Linux-saltstack-3 saltstack的grains和pillar的基本使用

    @ 目录 一.简介 二.grains 1.查看客户端所有的grains项 2.查看grains的所有的项和值 3.查看某个项和值 (1)语法1: (2)语法2: 4.根据grains来匹配目标主机 例 ...

  7. maven pom.xml 的 spring-boot-maven-plugin 红色报错 解决

    解决方法,添加对应的spring boot 版本号即可

  8. (随手记)Javascript 的parseInt函数,在IE和非IE内核浏览器运行的不同结果

    一段JS小程序: var str = "09"; var itr = parseInt(str); alert(itr); IE下运行,alert(0); 火狐和chrome下运行 ...

  9. ubuntu 18.04 关掉sudo密码

    关掉sudo密码 $ sudo visudo 找到如下行 %sudo ALL=(ALL:ALL) ALL 修改为 %sudo ALL=(ALL:ALL) NOPASSWD:ALL 这样sudo用户组的 ...

  10. vue爬坑之路(webpack 配置篇)

    在vue cli下 1.npm run dev 打开浏览器在config的index.js中修改autoOpenBrowser为true 关闭sourcemap productionSourceMap ...