JUC
并发编程学习
离别又见离别
只要继续走,总会到达自己的目的地
展开
-
BlockingQueue使用实例
ArrayBlockingQueue阻塞队列 FIFO 先进先出 public static void main(String[] args) throws InterruptedException {// test1(); test4(); } //有返回值 抛出异常 public static void test1(){ //队列大小 ArrayBlockingQueue blockingQueue原创 2022-01-26 17:57:17 · 304 阅读 · 0 评论 -
Callable实例
public class TestController { public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> stringFutureTask = new FutureTask<>(new MyThread()); //两个线程去执行 Callable只会打印一次,因为缓存提高原创 2022-01-26 17:54:34 · 278 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch同步减法计数器 public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 0; i < 6; i++) { new Thread(()->{ System.原创 2022-01-26 17:53:24 · 53 阅读 · 0 评论 -
synchronized 的虚假唤醒
问题出现原因if(num == 0){ //此处会出现【虚假唤醒】 this.wait()}解决 while(num == 0){ this.wait() }原因:拿两个加法线程A、B来说,比如A先执行,执行时调用了wait方法,那它会等待,此时会释放锁,那么线程B获得锁并且也会执行wait方法,两个加线程一起等待被唤醒。此时减线程中的某一个线程执行完毕并且唤醒了这俩加线程,那么这俩加线程不会一起执行,其中A获取了锁并且加1,执行完毕之后B再执行。如果是if的话,那原创 2022-01-26 17:50:05 · 232 阅读 · 0 评论 -
CopyOnWriteArrayList
ArrayList 的线程安全问题ArrayList 在并发线程的情况下,不是线程安全的,会报java.util.ConcurrentModificationException 并发修改异常。解决1.Vector(Vector jdk1.0出现的,arraylist是1.2出现的) 它主要是在add的时候加了synchronized2.Collections.synchronizedList 使用juc的Collections.synchronizedList3.CopyOnWriteArrayL原创 2022-01-26 17:41:22 · 69 阅读 · 0 评论 -
ThreadPoolExecutor参数说明
[ ThreadPoolExecutor的七大参数 ]int corePoolSize: 核心线程池大小int maximumPoolSize: 最大的线程池大小long keepAliveTime: 存活的时间 [ 超时了没有人使用,就释放 ]TimeUnit unit:存活的单位BlockingQueue< Runnable > workQueue:阻塞队列ThreadFactory threadFactory:线程工厂–创建线程的 一般不用动RejectedExecutio原创 2022-01-26 17:37:16 · 343 阅读 · 0 评论 -
CompletionService应用
public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService service = Executors.newFixedThreadPool(5); CompletionService<Integer> cs = new ExecutorCompletionService<>(service); ...原创 2022-01-26 17:29:39 · 228 阅读 · 0 评论 -
CompletableFuture补充
异常感知及任务完成感知 [ 返回最终结果 ] public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService service = Executors.newFixedThreadPool(5); CompletableFuture<Integer> future = CompletableFuture.supp原创 2022-01-26 17:28:27 · 230 阅读 · 0 评论 -
CompletableFuture异步编排
不建议的使用方式 public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println("main...start"); Thread01 thread01 = new Thread01(); thread01.start(); Runable01 runable01 = new Runabl原创 2021-06-21 17:26:59 · 211 阅读 · 0 评论 -
Disruptor笔记
更详细的文章: Disruptor详解Disruptor核心概念Disruptor:本质是无锁并发框架,用了很多的CAS来解决多线程抢夺问题,是在内存中处理。RingBuffer(环形缓冲区): 基于数组的内存级别缓存,是创建sequence(序号)与定义WaitStrategy(拒绝策略)的入口Disruptor(总体执行入口):对于RingBuffer的封装,持有RingBuffer、消费者线程池Executor、消费之集合ConsumerRepository等引用Sequence(序号.原创 2022-01-25 16:36:01 · 328 阅读 · 0 评论