看完后,你再也不用怕面试问并发编程啦(12)

方法介绍boolean compareAndSet(V expect, V update)如果是期望值expect与当前内存值一样,更新为update 代码: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之后 , 会释放所有等待的线程 , 执行后续操作 。 CountDownLatch类说明CountDownLatch(int count)创建CountDownLatch 实例并设置预定计数次数 。void countDown()递减锁存器的计数,如果计数到达零,则释放所有等待的线程 。如果当前计数大于零 , 则将计数减少1 。void await()使当前线程在锁存器倒计数至零之前一直等待 , 除非线程被中断 。如果当前的计数为零 , 则此方法立即返回 。 CountDownLatch 是通过一个计数器来实现的,计数器的初始值为线程的数量 。每当一个线程完成了自己的任务后,计数器的值就会减 1 。当计数器值到达 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 并发包中提供的一个并发工具类 。