个人简介

Echo Blog


江湖无名 安心练剑
  • java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring EventListener,超时处理和空循环性能优化
    异步转同步 业务需求 有些接口查询反馈结果是异步返回的,无法立刻获取查询结果。 正常处理逻辑 触发异步操作,然后传递一个唯一标识。 等到异步结果返回,根据传入的唯一标识,匹配此次结果。 如何转换为同步 正常的应用场景很多,但是有时候不想做数据存储,只是想简单获取调用结果。 即想达到同步操作的结果,怎么办呢? 思路 发起异步操作 ...
    2019-01-18 03:21:15 | Concurrency
  • JCIP-40-Lock Free 无锁算法
    Lock-Free 编程是什么? 当谈及 Lock-Free 编程时,我们常将其概念与 Mutex 或 Lock 联系在一起,描述要在编程中尽量少使用这些锁结构,降低线程间互相阻塞的机会,以提高应用程序的性能。 类同的概念还有 “Lockless” 和 “Non-Blocking” 等。 实际上,这样的描述只涵盖了 Lock-Free 编程的一部分内容。本质上说,Lock-Free 编...
    2019-01-18 03:21:15 | Concurrency
  • JCIP-39-Fork/Join 框架、工作窃取算法
    工作窃取算法 工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。 那么为什么需要使用工作窃取算法呢? 假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应,比如A线程负责处理A队列里的任务。 但是有的...
    2019-01-18 03:21:15 | Concurrency
  • JCIP-38-构建自定义的同步工具 Condition、AQS
    导读 类库中包含了许多存在状态依赖的类,例如FutureTask、Semaphore和BlockingQueue,他们的一些操作都有前提条件,例如非空,或者任务已完成等。 创建状态依赖类的最简单的房就是在JDK提供了的状态依赖类基础上构造。 例如第八章的ValueLactch,如果这些不满足,可以使用Java语言或者类库提供的底层机制来构造,包括 内置的条件队列 ...
    2019-01-18 03:21:15 | Concurrency
  • JCIP-37-StampedLock 读写锁中的最强王者
    StampedLock 简介 我们前面介绍了 ReentrantReadWriteLock可重入读写锁详解,不过 jdk1.8 引入了性能更好的 StampedLock 读写锁,我愿称之为最强! 一种基于能力的锁,具有三种模式用于控制读/写访问。 StampedLock的状态由版本和模式组成。 锁定采集方法返回一个表示和控制相对于锁定状态的访问的印记; 这些方法的“尝试”版本可...
    2019-01-18 03:21:15 | Concurrency
  • JCIP-36-ReentrantReadWriteLock 读写锁详解
    ReentrantLock 锁回顾 在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock. ReentrantLock是可重入的锁,它不同于内置锁, 它在每次使用都需要显示的加锁和解锁, 而且提供了更高级的特性:公平锁, 定时锁, 有条件锁, 可轮询锁, 可中断锁. 可以有效避免死锁的活跃性问题 Loc...
    2019-01-18 03:21:15 | Concurrency
  • JCIP-35-并发程序的测试
    并发程序的测试 编写并发程序时候,可以采取和串行程序相同的编程方式。唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。这对程序的应用会造成一些困难,那么如何在测试中,尽可能的暴露出这些问题,并且了解其性能瓶颈,这也是对开发者带来新的挑战。 本篇基于多线程知识,梳理一些多线程测试需要掌握的方法和原则,以期望可能的在开发阶段,就暴露...
    2019-01-18 03:21:15 | Concurrency
  • JCIP-34-性能与可伸缩性
    概述 编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。 那么,为什么还要编写并发程序? 线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得更简单,从而极大地简化了复杂系统的开发。此外,要想充分发挥多处理器系统的强大计算能力,最简单的方式就是使用线程。随着处理器数量的持续增长,如何高效地使用并发正变得越来越重要。 ...
    2019-01-18 03:21:15 | Concurrency