package cn.itcast.thread;import java.util.concurrent.atomic.AtomicReference;public class Test14 { public static void main(String[] args) { // 1. 创建一个User对象封装数据 User user = new User("李小华", 18); // 2. 创建一个原子引用类型AtomicReference操作User类型数据 AtomicReference<User> atomicReference = new AtomicReference<>(); // 3. 将user对象的数据存入原子引用类型对象中 atomicReference.set(user); // 4. 更新原子引用类型存储的数据 atomicReference.compareAndSet(user, new User("李中华", 20)); // 5. 打印普通user对象数据与原子引用类型对象数据 System.out.println("普通对象数据:"+ user +",对象hashcode: " + user.hashCode()); System.out.println("原子引用类型对象数据:" + atomicReference.get() + ",对象hashcode: " + atomicReference.get().hashCode()); }} 运行效果
文章插图
17、并发工具类:CountDownLatch(倒计数闭锁)目标:掌握CountDownLatch使用(实现等待其他线程处理完才继续运行当前线程)
介绍
CountDownLatch是一个同步辅助类 , 也叫倒计数闭锁,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 。用给定的计数初始化 CountDownLatch 。这个辅助类可以进行计算递减,所以在当前计数到达零之前,可以让现场一直受阻塞 。到达0之后 , 会释放所有等待的线程 , 执行后续操作 。

文章插图
传统join阻塞案例代码:
package cn.itcast.thread;public class Test15 { public static void main(String[] args) throws InterruptedException { // 创建线程1 Thread t1 = new Thread(() -> { System.out.println("parser1 finish"); }); // 创建线程2 Thread t2 = new Thread(() -> { System.out.println("parser2 finish"); }); t1.start(); t2.start(); t1.join(); // join阻塞 t2.join(); // join阻塞 System.out.println("join方式: all parser finish"); }} join阻塞效果:
文章插图
使用CountDownLatch实现阻塞代码优化:
package cn.itcast.thread;import java.util.concurrent.CountDownLatch;public class Test16 { // 定义倒计数闭锁对象 private static CountDownLatch countDownLatch = new CountDownLatch(2); public static void main(String[] args) throws InterruptedException { // 创建线程1 Thread t1 = new Thread(() -> { System.out.println("parser1 finish"); countDownLatch.countDown(); // 计算递减1 }); // 创建线程2 Thread t2 = new Thread(() -> { System.out.println("parser2 finish"); countDownLatch.countDown(); // 计算递减1 }); t1.start(); t2.start(); countDownLatch.await(); // 阻塞,计算为0释放阻塞,运行后面的代码 System.out.println("join方式: all parser finish"); }} 使用CountDownLatch实现阻塞效果:
文章插图
CountDownLatch倒计数闭锁好处:实现线程最大并发执行 。18、并发工具类:CyclicBarrier(同步屏障)目标:掌握CyclicBarrier的使用
介绍
CyclicBarrier是JDK 1.5的 java.util.concurrent 并发包中提供的一个并发工具类 。
- 所谓 Cyclic 即循环的意思,所谓 Barrier 即屏障的意思 。
- CyclicBarrier (可重用屏障/栅栏)类似于 CountDownLatch功能一样,都有让多个线程等待同步然后再开始下一步动作 。
- CyclicBarrier 可以使一定数量的线程反复地在屏障位置处汇集 。当线程到达屏障位置时将调用 await() 方法,这个方法将阻塞直到所有线程都到达屏障位置 。如果所有线程都到达屏障位置,那么屏障将打开 , 此时所有的线程都将被释放 , 而屏障将被重置以便下次使用 。
推荐阅读
- “正科级”公务员退休后有多少钱?40年工龄的话,预计是这个数
- 女人对你有好感,哪怕嘴上不说,这7个肢体语言也藏不住
- “无性婚姻”有多可怕?听听3个过来人的故事,希望你能引以为戒
- 家里放了几年的红茶、绿茶、普洱茶,还能喝吗?医生告诉你实话
- 求求你们别再换脸了,就像好好的一盘菜吃出苍蝇的感觉!
- 拒认儿子巴图20年,晚年态度翻转,是居心叵测,还是真后悔?
- 教你自己制作花生酱,教你自制花生酱
- 微博该咋得才可以删除评论,为什么微博评论删除后还有显示
- 《我知道我爱你》热播:和冬天适配的偶像剧
- 李善均离世早有端倪?留下遗书后离家,现场有点燃闪电弹的痕迹
