【Java 并发编程】一文了解线程间有哪些通信方式?

news2025/2/28 2:47:58

一文了解线程间有哪些通信方式?

  • 1. synchronized 内置锁
  • 2. volatile 关键字
  • 3. 等待/通知机制
    • 3.1 等待
      • wait()
      • wait(long)
      • wait(long, int)
      • 等待方需遵循如下原则
    • 3.2 通知
      • notify()
      • notifyAll()
      • 通知方需遵循如下原则
      • notify() 和 notifyAll() 应该用谁?
  • 4. 管道输入/输出流
  • 5. Thread.join()
    • 面试题
  • 6. ThreadLocal

在这里插入图片描述

1. synchronized 内置锁

关键字 synchronized 可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。

2. volatile 关键字

关键字 volatile 可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。

3. 等待/通知机制

可以通过 Java 内置的等待/通知机制 - wait()、notify/notifyAll() 实现一个线程修改一个对象的值,而另一个线程感知到了变化,然后进行相应的操作。

3.1 等待

wait()

调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回。

需要注意:调用 wait() 方法后,会释放对象的锁。

wait(long)

超时等待一段时间,这里的参数时间是毫秒,也就是等待长达 n 毫秒,如果没有通知就超时返回。

wait(long, int)

对于超时时间更细粒度的控制,可以达到纳秒。

等待方需遵循如下原则

  1. 获取对象的锁;

  2. 如果条件不满足,那么调用对象的 wait() 方法,被通知后仍要检查条件;

  3. 条件满足执行业务逻辑。

synchronized (对象) {
    while (条件不满足) {
        对象.wait();
    }
    do something;
}

3.2 通知

notify()

通知一个在对象上等待的线程,使其从 wait() 方法返回,而返回的前提是该线程获取到了对象的锁,没有获得锁的线程重新进入 WAITING 状态。

notifyAll()

通知所有等待在该对象上的线程

通知方需遵循如下原则

  1. 获取对象的锁;

  2. 改变条件;

  3. 通知所有等待在对象的线程。

synchronized (对象) {
    改变条件;
    对象.notifyAll();
}

notify() 和 notifyAll() 应该用谁?

尽可能用 notifyAll(),谨慎使用 notify()。因为 notify() 只会唤醒一个线程,我们无法确保被唤醒的这个线程一定就是我们需要唤醒的线程

4. 管道输入/输出流

管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要用于线程之间的数据传输,而传输的媒介为内存。

管道输入/输出流主要包括了如下4种具体实现:PipedOutputStream、PipedInputStream、PipedReader 和 PipedWriter,前两种面向字节,而后两种面向字符。

5. Thread.join()

如果一个线程A执行了 Thread.join() 语句,其含义是:当前线程A等待 Thread 线程终止之后才从 Thread.join() 返回。线程 Thread 除了提供 join() 方法之外,还提供了join(long millis) 和 join(long millis,int nanos) 两个具备超时特性的方法。

面试题

现在有 T1、T2、T3 三个线程,怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?

用 Thread.join() 方法即可,在 T3 中调用 T2.join(),在 T2 中调用 T1.join()。

6. ThreadLocal

ThreadLocal,即线程变量,是一个以 ThreadLocal 对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个 ThreadLocal 对象查询到绑定在这个线程上的一个值。

可以通过 set(T) 方法来设置一个值,在当前线程下再通过 get() 方法获取到原先设置的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第18章_JDK8-17新特性(下)

第18章_JDK8-17新特性(下) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 6. 新语法结构 新的语法结构,为我们勾勒出了 Java 语法进化的一个趋势&#xff0c…

STM32 库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别

问题:当我使用STM32库函数对 I/O 口进行赋值时,在头文件中发现有四个相关的函数可以做这个操作,那么它们有什么区别呢? 一、GPIO_SetBits //eg: GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);解释:置位(置1)选择的数…

十、市场活动-分页查询

功能需求 ①、当市场活动主页面加载完成之后,显示所有数据的第一页; ②、用户在市场活动主页面填写查询条件,点击"查询"按钮,显示所有符合条件的数据的第一页,保持每页显示条数不变 ③、实现翻页功能. *在市场活动主页面,显示市场活动列表和记录的总条…

Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)

目录背景意外发现结论背景 上篇Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable,我把WebMvcConfig 代码加入项目后,会报冲突的问题。如下所示。 requestMappingHandlerMapping: defined by method ‘requestMappingHandlerM…

The 1st Universal Cup Stage 12: ̄Ookayama, April 15-16, 2023 题解

A XOR Tree Path 给一颗树&#xff0c;树上点有黑白两色&#xff0c;每次可以选一个叶子节点&#xff0c;翻转其到根路径上所有点的颜色&#xff0c;问最大黑色点数。 树dp #include<bits/stdc.h> using namespace std; #define MAXN (10000010) #define ll long long…

计及氢能的综合能源优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用国密SSL证书,实现SSL/TLS传输层国密改造

密码是保障网络空间安全可信的核心技术和基础支撑&#xff0c;通过自主可控的国产密码技术保护重要数据的安全&#xff0c;是有效提升我国信息安全保障水平的重要举措。因此&#xff0c;我国高度重视商用密码算法的应用并出台相关政策法规&#xff0c;大力推动国产商用密码算法…

.Net MVC中 视图如何使用路由!!!

配置路由 app.UseEndpoints(endpoints > { endpoints.MapControllerRoute( name: "default", pattern: "{controllerHome}/{actionIndex}/{id?}"); }); 在视图中使用路由 页面跳转常用的路由设置 标签属性 描述 asp-action 指定…

STL容器总结

1.Vector&#xff1a; 本质是动态数组&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变&#xff0c;能非常好的支持随机存取&#xff0c;即[]操作符&#xff0c;但由于它的内存空间是连续的&#xff0c;所以在中间进行插入和删除会造成内存块的拷贝&#xff0c…

C++之 文件操作(file operation)

目录 引言 一、文本文件 1、写文件 2、读文件 二、二进制文件 1、写文件 2、读文件 引言 程序运行时产生的数据属于临时数据&#xff0c;程序一旦运行结束后&#xff0c;数据也会被释放 通过文件可以将数据保存以持久化 在C中&#xff0c;对文件进行操作要写头文件<f…

图染色问题的NP完全性证明

文章目录1.Overview2.CNF 3-sat3. Gadgets3.1 Concolorous Edges3.2 Starter/Variable Gadget3.3 Splitter Gadget3.4 OR Gadget3.5 Clause Gadget4. To Planar Graph最近在学 6.890&#xff0c;然后 devans 刚好问了我这个问题&#xff0c;然后尝试编了一个证明。 1.Overview…

功能测试面试没人要了!软件自动化测试如何入门?

对于我来说&#xff0c;我做的是web端的测试&#xff0c;做测试也有好几个年头了&#xff0c;每次都是使用手工测试的话&#xff0c;一直是做重复性的工作&#xff0c;既枯燥又繁琐&#xff0c;所以我在两年前自己使用java语言写了一系列的自动化测试脚本&#xff0c;利用的框架…

Java数据结构与算法----动态规划(背包篇)

1. 0/1背包 1.1.算法思路 0/1背包是动态规划、背包问题中最经典的问题啦&#xff01;它主要的问题是&#xff1a; 给定n种物品、这n种物品的重量分别是&#xff0c;价值分别是 &#xff0c;而你有一个容量为C的背包&#xff0c;请问如何求出所能拿的最大价值呢&#xff1f; …

嵌入式开发——串口常见问题和调试手段

1、串口介绍 参考博客&#xff1a;《ARM芯片&#xff08;S5PV210芯片&#xff09;——串口通信详解》、《UART和RS232、RS485的联系和区别、以及对软件编程的影响》&#xff1b; 2、串口常见问题 (1)内核没有开启串口&#xff0c;导致没有产生设备节点&#xff1b; (2)上层应用…

运动想象脑电信号数据集及其预处理方法

脑电信号基础知识 在BCI应用中,获取脑信号的途径包括多种技术方式。其中,EEG是最适合脑机接口应用的技术,主要因为无创性、便携式和高时间分辨率是其的优势。EEG是记录头部表面不同位置之间电位差异的时间记录,它起源于分布在大脑皮层的数百万个神经元的同步电活动的总和。…

我把Solon打包成了native image,速度快的惊人

Solon 一个高效的应用开发框架&#xff1a;更快、更小、更简单。https://solon.noear.org/ 我刚开始对 Solon 感兴趣的原因&#xff0c;就是启动快、包体积小&#xff0c;用了一段时间之后&#xff0c;发现 Solon 使用 GraalVM native iamge 打包有一些问题&#xff0c;我把问题…

Cache;高速缓冲存储器

高速缓冲存储器 概述 ​ 在多体并行存储系统中&#xff0c;由于IO设备向主存请求的级别高于CPU访存&#xff0c;这就出现了CPU等待IO设备访存的现象&#xff0c;导致CPU空等一段时间&#xff0c;甚至等待几个周期&#xff0c;从而降低了CPU的工作效率&#xff0c;为了避免CPU…

Eclipse环境搭建并且运行wordcount程序

一、安装Hadoop插件 1. 所需环境 hadoop2.0伪分布式环境平台正常运行 所需压缩包&#xff1a;eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz           在Linux环境下运行的eclipse软件压缩包,解压后文件名为eclipse           hadoop2x-eclipse-plugin-m…

【Mysql】事物处理(TransAction Processing)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶最近在复习mysql&#xff0c;复习到了mysql事物处理&#xff08;TransAction&#xff09;&#xff0c;帮自己回顾一下&#xff0c;如果你也想了解什么是mysql的事物处理&#xff0c;希望这篇…

【SQL Server】无需公网IP,就可以远程连接SQL Server数据库

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 1.前言 数据库的重要性相信大家…