JAVA多线程进阶篇 8、JUC同步器之Exchanger

多线程安全——JUC工具汇总 LongAdder JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。 根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈————AtomicLong 具有更好的性能,代价是消耗更多的内存空间: 转存失败重新上传取消 ... 阅读详情


JUC 即 java.util.concurrent 包,提供了大量的工具类来简化并发编程。

Exchanger 交换者,是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。

  • 它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方.。

  • Exchanger.exchange() 这是一种阻塞方法 , 线程A将被阻塞,直到线程B到来并将其对象传输到线程A 为止。(可能会因超时或中断抛出异常)

1. Exchanger的应用场景

  • Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。
  • Exchanger也可以用于校对工作。比如我们需要将纸制银流通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到Excel之后,系统需要加载这两个Excel,并对这两个Excel数据进行交换和校对。

2.Exchanger的使用示例一

public class ExchangerTest {
    Exchanger<String> exchanger = new Exchanger<>();

    void m(String s){
        try {
            System.out.println("step1 "+Thread.currentThread().getName()+" s="+s);
            s = exchanger.exchange(s);
            System.out.println("step2 "+Thread.currentThread().getName()+" s="+s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
        }
    }

    public static void main(String[] args) {
        ExchangerTest test = new ExchangerTest();
        new Thread(()->{test.m("123");}).start();
        new Thread(()->{test.m("abc");}).start();
    }
}

运行结果,线程1、2之间交换了字符串。

Exchanger1

3. Exchanger的使用示例二

import java.util.concurrent.Exchanger;

public class ExchangerTest {
    Exchanger<String> exchanger = new Exchanger<>();

    void m(String s){
        try {
            String s2 = exchanger.exchange(s);
            System.out.println(Thread.currentThread().getName()+" s="+s+",交换后,s2="+s2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ExchangerTest test = new ExchangerTest();
        while (true) {
            new Thread(()->{test.m("123");}).start();
            new Thread(()->{test.m("abc");}).start();
            new Thread(()->{test.m("456");}).start();
            new Thread(()->{test.m("edf");}).start();
            Thread.sleep(1000);
        }
    }
}

将程序改造为4个线程同时交换。此时线程拿到123”,跟其他的线程交换,有可能交换为“edf”、456、“abc”。

Exchanger2

总结

Exchanger 交换者,是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在同步点可以阻塞等待也可以设置超时、或被中断。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

Java高并发开发核心:JUC工具包深度解析与实战指南 并发编程是构建高性能、高可用Java应用的核心技术之一,其核心在于通过多线程机制充分利用多核CPU资源,提升系统吞吐量。其实现原理主要围绕线程安全、锁机制和线程协作展开,通过同步控制确保共享数据的一致性。在技术价值层面,良好的并发设计能显著提升系统响应速度和资源利用率,是应对高并发场景的关键。常见的应用场景包括缓存系统、订单处理、批量任务执行和连接池管理等。本文聚焦于Java并发编程的基石——JUC(java.util.concurrent)工具包,深入剖析其核心组件如ReentrantLock、Concu 阅读详情

相关推荐

番茄(西红柿)叶片病害检测数据集:12k+图像,10类,yolo标注

本文介绍了包含12,250张图像的番茄叶片病害检测数据集,涵盖10种常见病害类型及健康叶片,采用YOLO格式标注。数据集具有三大核心价值:科研层面填补病害样本空白,推动算法创新;产业应用支持精准诊断、早期预警,降低损失20-40%;社会生态方面减少农药使用15-30%,助力绿色农业。该数据集作为AI与农业结合的数字基础设施,适用于计算机视觉项目、科研实验等场景。

m0_73878864的博客 1135

并发编程之Exchanger原理与使用

在JUC包中,除了一些常用的或者说常见的并发工具类(ReentrantLock,CountDownLatch,CyclicBarrier,Semaphore)等,还有一个不常用的线程同步器类 —— Exchanger。Exchanger是适用在两个线程之间数据交换的并发工具类,它的作用是找到一个同步点,当两个线程都执行到了同步点(exchange方法)之后(有一个没有执行到就一直等待,也可以设置等待超时时间),就将自身线程的数据与对方交换。

meser88的博客 1798

解决Surface更新后Bitlocker无限循环的问题

在Surface系统更新以后,出现要求输入Bitlocker恢复密钥的问题。已经输入正确密钥以后,依然无法正常进入Windows操作系统,一旦重启依然循环Bitlocker要求输入密钥的界面。 一旦到登录界面,点击“登录”之后又跳转回登录界面.,但就是无法进入桌面。 解决方案: 拒绝暴力重装!这个问题是Bitlock把盘给锁了,所以要解锁 重启之后,直接点击右下角“跳过这个驱动器” 选择“疑难解答”,然后进入命令提示符 先查看判断现在是不是被锁了: 输入: manage-bde -status c

premierapp的博客 1万+

JUC工具类-Exchanger

是包中的一个同步工具类,用于两个线程之间的数据交换。它提供了一个同步点,当两个线程都到达该点时,它们就可以交换数据。实现两个线程间的双向数据传递构建双缓冲结构,实现数据处理与生成分离替代共享队列,实现直接交换数据的生产者-消费者模式在遗传算法中用于染色体交换在管道处理架构中用于模块之间的数据传递ExchangerArena是一个由多个槽位组成的数组结构,允许多个线程并行配对交换。每个线程将被分配到 Arena 的一个槽位层级(level)进行配对。

左灯右行的爱情 1164

TensorFlow GPU版本安装步骤-Windows系统

本文由在Windows下安装TensorFlow GPU版本教程-优快云等整理得到。 目录 1、确认显卡是否支持CUDA 1.1 查看显卡信息 打开“设备管理器”,查看显卡信息,如下图所示: 由上图知,本电脑的显卡为NVIDIA Quadro P400. 1.2 查看支持CUDA的显卡 网址:https://developer.nvidia.com/cuda-gpus 经查询可知,该显卡支持CUDA,如下图所示: 2、安装CUDA 2.1 下载CUDA 网址:https://developer.nvi

x_lingyun的专栏 766

python监听海康威视报警服务器

因为我使用海康威视摄像头是自带热成像的所以事件报警会上报两张图片,一张是RGB图像、另一张是热成像图像,因此使用。拿到的就是第一张RGB图像。可以点击测试,会显示。

qq_57018478的博客 1157

JUC---Exchanger

Exchanger原理介绍 Exchanger用于线程间的通信和数据交换;它提供了一个exchange方法,两个线程调用exchange方法时,线程1先调用该方法会进入阻塞状态,直到线程2调用该方法,然后安全交换数据,之后两个线程继续运行。 应用场景之一:游戏中玩家之间直接交易物品。 Exchanger的原理是使用了ThreadLocal来实现的,至于线程阻塞的部分是使用java中的Usafe类park()/unpark()来实现的。 ...

蓝天⊙白云的博客 269

POI 写word,添加标题,表格,图片,自动生成目录,合并单元格

工程地址:https://github.com/zheng-chang-wei/word package com.example.demo1.poi; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.File; import java.io.FileOutputStream; public class ...

zheng_chang_wei的博客 6155

常用的JUC(Java Util Concurrent)工具类

包下的原子类为Java并发编程提供了一组高效的、线程安全的原子操作类,它们主要用于在高并发环境下确保对共享变量的操作具有原子性,即在同一时刻只有一个线程能够修改这些变量的值,而不会出现因多线程并发导致的中间状态或数据竞争问题。当两个线程都到达交换点时,它们各自携带的数据会被互换,确保线程间的通信和协作。,等待其他线程也到达屏障。当所有线程都到达后,屏障动作执行,然后屏障重置,线程们继续进行下一次迭代,如此反复三次。的特性,它们各自操作的是独立的本地副本,因此输出结果互不影响,展示了线程间数据的隔离。

weixin_44440231的博客 2630

2、Minikube安装Ingress

文章目录前言一、Ingress安装二、Ingress Demo1.创建一个pod和service2.部署ingress3.添加minikube域名映射三、遇到的坑 前言 上篇介绍了Minikube的安装,本篇介绍一下如何在Minikube中安装Ingress。 一、Ingress安装 Ingress安装很简单,Minikube里面带了Ingress附件。 安装Ingress minikube addons enable ingress 禁用Ingress minikube addons disa

star_apple的博客 3071

大模型——AI对话四象限

{ "摘要": "文章揭示了90%的人不会有效与AI沟通的问题,指出简单粗暴的提问只能得到标准答案。作者提出'AI对话四象限'模型:1)双方都懂时提效;2)AI懂但需学会分层提问;3)共同探索未知领域;4)向AI传授独家知识。强调沟通技巧的重要性,认为会提问的人不会被AI替代。最后呼吁读者尝试四象限思维,与AI碰撞火花。" }

312

【Java EE 初阶】JUC常见工具类介绍

个选手依次就位,哨声响才同时出发;所有选手都通过终点,才能颁奖。操作中的加减计数器操作都是原子的。可以在多线程环境下直接使用。阻塞等待所有任务执行完毕。内部的计数器同时自减。

m0_57248981的博客 1240

VS2019项目使用CGAL6.1配置教程详细步骤

在VS2019项目中使用CGAL详细步骤

插件开发 331

JUC-08同步器Synchronizers

Java同步器是并发编程中用于线程协作的高级工具类,主要包括CountDownLatch、CyclicBarrier、Semaphore、Exchanger和Phaser等。每种同步器都有特定的应用场景:CountDownLatch基于计数器实现线程等待,CyclicBarrier支持循环使用的线程屏障,Semaphore控制资源访问并发数。这些同步器底层多基于AQS(AbstractQueuedSynchronizer)实现,提供了比传统synchronized更灵活的线程同步机制。通过合理使用这些同步器

d3y1`5 81_09 1057

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java多线程(7):JUC(上)

前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了。而要想用好多线程,其实是可以取一些巧的,比如JUC(好多面试官喜欢问的JUC,就是现在要讲的JUC)。

分享专业、有用、有趣的技术、产品、运营和管理知识。 229

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java并发工具类全面盘点:从同步器到并发容器实战指南

(简称JUC)是Java提供的并发编程工具包,从JDK 1.5开始引入,参考自EDU.oswego.cs.dl.util.concurrent,是JSR 166标准规范的具体实现。JUC包为开发者提供了丰富的并发编程原语和高级抽象,极大地简化了多线程程序的开发难度。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 165

JUC包中的各种同步器

park(): 阻塞当前线程,直到unpark方法被调用或当前线程被中断,park方法才会返回。parkNanos(long nanos): 同park方法,nanos表示最长阻塞超时时间,超时后park方法将自动返回。单位是纳秒 ,1秒 = 100010001000 纳秒parkUntil(long deadline): 同park()方法,deadline参数表示最长阻塞到某一个时间点,当到达这个时间点,park方法将自动返回。(该时间为从1970年到现在某一个时间点的毫秒数)

qq_39701205的博客 1029

Java并发编程 - JUC同步器工具(CyclicBarrier、Exchanger、Phaser)

Exchanger, 和Phaser都是 Java 并发编程中常用的同步工具,它们各自解决了不同的问题。用于一组线程相互等待,直到到达某个公共屏障点。适用于需要一组线程同步执行的场景。Exchanger用于两个线程之间的数据交换。适用于需要在两个线程之间传递数据的场景。Phaser提供了更灵活的管理参与线程的方式,适用于需要动态调整参与线程集合的场景。在使用这些同步工具时,通常会结合具体的并发需求来选择合适的工具。这些工具可以有效地帮助管理线程间的同步问题,提高并发性能。

qq_33240556的博客 577

JUC 工具类之 Exchanger 详解

一 Exchanger 简介 线程间的数据共享除了定义一个共享数据然后各个线程去访问这种方式外,还可以使用 Exchanger 交换数据。 Exchanger——交换器,是 JDK1.5 时引入的一个同步器,从字面上就可以看出,这个类的主要作用是:进行两个线程之间的数据交换。 Exchanger 有点类似于 CyclicBarrier,我们知道 CyclicBarrier 是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。 Exchanger 可以看成是一个双向栅栏,如下图: Th

liuwg1226的专栏 912

并发编程 — 6.5 JUC — 同步器

同步器名称 作用 CountDownLatch 倒数计数器,构造时设定计数值,当计数值归零后,所有阻塞线程恢复执行;其内部实现了AQS框架 CyclicBarrier 循环栅栏,构造时设定等待线程数,当所有线程都到达栅栏后,栅栏放行,然后再进行新的一次循环。其内部通过ReentrantLock和Condition实现同步 Semaphore 信号量,类似于“令牌...

sinat_27593959的博客 238

JUC并发编程之同步器(Semaphore、CountDownLatch、CyclicBarrier、Exchanger、CompletableFuture)附带相关面试题

1.Semaphore(资源调度)、2.CountDownLatch(子线程优先)、3.CyclicBarrier(栅栏)、4.Exchanger(公共交换区)、5.CompletableFuture(异步编程)

Alphamilk的博客 371

科普文:JUC系列之多线程门闩同步器Exchanger的使用和源码解读

Exchanger是一个用于线程间协作的工具类,Exchanger用于进行两个线程间(只能两个)的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据。

为无为,事无事,味无味。 491

Java JUC并发编程全面解析:从原理到实战

Java并发编程进阶:JUC核心组件与AQS原理 摘要:本文系统讲解Java并发工具包(JUC)的核心知识体系,包含五大组件:锁框架(locks)、原子类(atomic)、并发工具(tools)、并发集合(collections)和线程池(executor)。重点剖析ReentrantLock的可重入、公平/非公平特性及读写锁实现原理,深入解析AQS同步器底层机制。通过对比synchronized与JUC锁的差异,帮助开发者根据场景选择合适并发工具,提升高并发系统性能。课程采用"理论+实践&quo

百锦再的博客 1167

JUC同步器特点及应用场景

Semaphore 、CountDownLatch、CyclicBarrier、Exchanger

qq_14886109的博客 472

JUC 基本操作

一、JUC-TimeUnit枚举 TimeUnit是 java.util.concurrent 中的一个枚举类(时间单元类)。一般让进行控制线程睡眠时使用。 TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),相比 Thread.sleep()方法的一个好处就是 TimeUnit可以设置时间单位。 这个类支持有:日(DAYS)、时(HOURS)、分(MINUTS)、秒(SECONDS)、毫秒(MILLISECONDS)、微秒(MICROSECONDS)、纳...

Charge8的博客 760

并发编程-锁分类以及JUC包下的锁

摘要:本文系统介绍了Java并发编程中的锁机制及其优化方案。首先分析了synchronized的局限性,包括无法区分读写操作、无获取锁状态反馈及阻塞问题。随后详细讲解了多种锁分类:悲观锁与乐观锁、自旋锁与自适应自旋锁、可重入锁与非可重入锁、公平锁与非公平锁、读写锁与排他锁。重点阐述了JUC包下的核心组件,包括AQS抽象类和Lock接口体系(ReentrantLock、ReadWriteLock等)。最后通过代码示例展示了Semaphore、CountDownLatch和Exchanger三种实用并发工具类的

m0_51751350的博客 964
上一篇: JAVA多线程进阶篇 4、JUC工具类之CyclicBarrier
下一篇: JAVA多线程进阶篇 9、JUC工具类之LockSupport
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值