随笔分类 - 并发编程
摘要:1. 简介 Java7提供了可以将大任务拆分成小任务执行再合并结果的框架——Fork/Join。其中,将大任务拆分成足够执行的小任务并发执行的过程称为Fork,将这些小任务结果整合后形成最终的结果的过程称为Join。 Fork/Join框架的具体体现为ForkJoinTask抽象类,该类继承了Fut
阅读全文
摘要:1. 简介 相比Future(【并发编程】Java5 - Future,基本使用),Guava提供的ListenableFuture支持不阻塞主线程进行任务执行完成后的业务处理。 使用Future的实现类FutureTask想要实现一旦获取到结果立即执行后续的业务,就需要阻塞主线程等待结果或者使用其
阅读全文
摘要:1. 简介 CompletableFuture是Java8的新特性,在Future基础上,增加流式计算、函数式编程、完成通知、自定义异常、多个Future组合处理等能力,使得在多线程协同处理时更加顺利。 2. 相关博客 【并发编程】Java5 - Future,基本使用 【并发编程】Java5 -
阅读全文
摘要:1. 简介 相比Future(【并发编程】Java5 - Future,基本使用),CompletionService除了支持并行执行任务并获取结果外,还支持优先获取到最快执行的任务结果,但CompletionService要求并行执行的任务是无序的。 使用Future的实现类FutureTask获
阅读全文
摘要:1. 简介 在使用多线程开发中,不论是继承Thread类还是实现Runnable接口方式,都无法非常方便的获取异步任务执行的结果。在JDK1.5提供了和Runnable类似但多了返回值的Callable接口,通过Future接口实现类和Callable接口方式,可以非常灵活的进行多线程操作,例如:获
阅读全文
摘要:1. 继承Thread类 import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; /** * 继承Thread类创建多线程单元测试 * * @author CL */ @Slf4j public class Threa
阅读全文
摘要:1. 自定义线程池 1.1 示例代码 /** * 自定义线程池 * <p> * 优点:可以自定义参数 * </p> */ @Test public void testNewThreadPoolExecutor() { ThreadPoolExecutor executor = new ThreadP
阅读全文
摘要:1. 简介 阻塞队列(BlockingQueue)是Java中一种线程安全的存取队列,适用于生产者消费者场景,支持两种附件操作: 生产者线程不断的往阻塞队列中放入数据,直到队列放满为止。队列放满后,生产者线程阻塞等待消费者线程获取数据。 消费者线程不断的从阻塞队列中火球数据,直到队列为空。队列为空后
阅读全文
摘要:1. 简介 Java中常见的四种并发工具类: CountDownLatch CyclicBarrier Semaphore Exchanger 2. 主线程等待子线程之CountDownLatch 原理 CountDownLatch允许一个或多个线程等待其他一组线程完成操作,再继续执行。 Count
阅读全文
摘要:1. 悲观锁 / 乐观锁 在Java和数据库中都存在悲观锁和乐观锁的应用。Mysql锁机制中的悲观锁和乐观锁请查看: Mysql锁机制--悲观锁和乐观锁 悲观锁:在获得数据时先加锁,只到数据操作(更新)完成,确保不会被其他线程所影响。例如:Java中synchronized关键字和Lock的实现类都
阅读全文
摘要:1. CAS简介 在计算机科学中,比较和交换(Compare And Swap)是用于实现多线程同步的原子指令。它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算;如果该值在同一时间被另一个线程更新
阅读全文
摘要:1. 复现问题 import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * 复现问题 * * @author CL * */ public class RecurrenceProblem { publ
阅读全文
摘要:1. 内存模型 若一个变量在多线程环境下同时操作,则可能出现结果不一致的情况。这就是常说的缓存不一致性问题。 解决缓存不一致问题,通常有两个解决方案: 通过在总线加LOCK#锁的方式 因为CPU和其他部件进行通信都是通过总线来进行的,如果对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访
阅读全文