随笔分类 - 线程
摘要:#(前言) 最近在做一些东西的时候,时常需要使用多线程来提升一下性能,但是在使用线程池的时候会发现无法捕获其中线程的异常,这个该如何处理呢,talk is chep show me the code #(单线程情况) 对于单线程来说,只需要重写UncaughtException就好了,如下: /**
阅读全文
摘要:首先做个对比: disruptor: 内存队列,使用场景一般在系统内部,提高在高并发的情况下系统的性能,一般作用于线程间的消息传递 kafka: 分布式消息队列,使用场景一般在系统和系统间的消息传递,吞吐量高,也适用于消息流数据处理的中间件 已经不记得最早接触到 Disruptor 是什么时候了,只
阅读全文
摘要:一文秒懂 Java Fork/Join fork/join 框架是 Java 7 中引入的 ,它是一个工具,通过 「 分而治之 」 的方法尝试将所有可用的处理器内核使用起来帮助加速并行处理。 在实际使用过程中,这种 「 分而治之 」的方法意味着框架首先要 fork ,递归地将任务分解为较小的独立子任
阅读全文
摘要:一、VarHandle简介变量句柄(VarHandle)是对于一个变量的强类型引用,或者是一组参数化定义的变量族,包括了静态字段、非静态字段、数组元素等,VarHandle支持不同访问模型下对于变量的访问,包括简单的read/write访问,volatile read/write访问,以及CAS访问
阅读全文
摘要:引言 讲完了CyclicBarrier和CountDownLatch,今天讲一个跟这两个类有点类似的Phaser.->移相器 java7中引入了一种新的可重复使用的同步屏障,称为移相器Phaser.Phaser拥有与CyclicBarrier和CountDownLatch类似的功劳.但是这个类提供了
阅读全文
摘要:引言今天我们讲最后一个同步工具类Exchanger,这个比较简单,就是让两个线程交换数据. 理论Exchanger只有两个方法而已,而且两个还是一样的,只是参数不通而已* exchange(V x) 跟另外一个线程交换数据x,如果另外一个线程的数据准备好,那么当前线程会立刻返回,并获得另外一个线程的
阅读全文
摘要:LongAdder LongAccumulator 用法实例如果程序内有高度的竞争,大量的线程访问同一个原子值,可以使用 LongAdder 和 LongAccumulator,这个类是 Java 8 提供用于在高度竞争环境下替代 AtomicLong 的。 LongAdder adder = ne
阅读全文
摘要:synchronize必须是重入锁,为什么呢? 就是因为父子类不会破坏继承基础思想: 父子类对象锁重入的意思是子类的同步方法调用了父类的同步方法同样不需要再去竞争锁,因为该线程已经拥有了该对象的锁,子类对象继承了父类的方法。 我们看下代码: 父类: package com.ck.thread; pu
阅读全文
摘要:源码: getAndIncrement: public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) re
阅读全文
摘要:文章目录 一、使用同一个共享变量控制 Synchronized、wait、notify Lock、Condition 利用volatile 利用AtomicInteger 二、PipedInputStream、PipedOutputStream 三、利用BlockingQueue 四、利用LockS
阅读全文
摘要:有时候,对于在多线程中使用static变量有没有冲突,是否存在安全问题不能十分的确定。在使用过程中有点含糊,总想找点时间好好追究一下,可总因开发项目时间的紧迫而搁浅。 线程,是我们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语。那什么是线程安全呢?通俗点说,就是线程访问时不产生资源冲突。
阅读全文
摘要:概述 服务端编程的一个经典场景是在接收和处理客户端请求时,为了避免对每一个请求都分配线程而带来的资源开销,服务一般会预先分配一个固定大小的线程池(比如Tomcat connector maxThreads),当客户端请求到来时,从线程池里寻找空闲状态的线程来处理请求,请求处理完毕后会回到线程池,继续
阅读全文
摘要:场景 在分片上传的时候,有返回对应的etag,所以,我需要在分片上传完成之后,对返回的数据进行封装,封装完成后调最后的完成接口.出现问题,总是缺少部分分片,偶尔会报错… 模拟 for循环创建CompletableFuture,然后执行allOf方法看看: public static void mai
阅读全文
摘要:我喜欢Java 8的CompletableFuture,但它有它的缺点: 惯用的超时处理就是其中之一。 JAVA 8我们只能收集异常信息,再次执行什么的(以下是JAVA8解决超时的方式,获取结果后你该做什么做什么): //我们让list里传入方法的参数1号报错和5号超时 public class T
阅读全文
摘要:最近在项目使用Java8 的CompletableFuture执行一些异步多线程任务,一时疏忽,导致ArrayList出现线程安全问题 就算在方法内使用局部变量,但使用异步多线程执行任务,还是会出现线程安全问题 以下是错误、正确使用的示例方法: package test; import java.t
阅读全文
摘要:1、 runAsync 和 supplyAsync方法 CompletableFuture 提供了四个静态方法来创建一个异步操作。 public static CompletableFuture<Void> runAsync(Runnable runnable) public static Comp
阅读全文
摘要:主要是在项目中(中小型项目) 有支付下单业务(只是办理下单,没有涉及到商品库存),目前用户量还没有上来,没有出现问题,但是想到如果用户量变大,下单并发量变大,可能会出现一系列的问题,趁着空闲时间,做了这个demo测试相关问题。 可能遇到的问题如下: 1.订单重复 2.高并发下,性能变慢 解决方式:T
阅读全文
摘要:很多朋友应该关注到了。线程池的执行任务有两种方法,一种是 submit、一种是 execute; 这两个方法是有区别的,那么基于这个区别我们再来看看。 execute 和 submit 区别 1. execute 只可以接收一个 Runnable 的参数 2. execute 如果出现异常会抛出 3
阅读全文
摘要:本文主要讲解线程池的完成服务: CompletionService接口定义了一组任务管理接口: 1.submit() - 提交任务; 2.take() - 获取任务结果; 3.poll() - 获取任务结果 ExecutorCompletionService类是CompletionService接口
阅读全文