背景 最近在看同事的消息平台的问题进行优化,其中一点就是推送来的消息没有区分优先级,造成实时性要求高的不能优先满足,被全网下发的普通优先级占用了,造成消息延迟。 对应的改进一点就是采用把现有线程池改为优先级队列。 实现 …
分类:Java多线程
Thread类源码解读(3)——线程中断interrupt
前言 线程中断是一个很重要的概念,通常,取消一个任务的执行,最好的,同时也是最合理的方法,就是通过中断。 本篇我们主要还是通过源码分析来看看中断的概念。 本文的源码基于JDK1.8 Interrupt status &a…
FutureTask源码解析(1)——预备知识
前言 FutureTask 是一个同步工具类,它实现了Future语义,表示了一种抽象的可生成结果的计算。在包括线程池在内的许多工具类中都会用到,弄懂它的实现将有利于我们更加深入地理解Java异步操作实现。 在分析它的源…
逐行分析AQS源码(2)——独占锁的释放
前言 上一篇文章 我们逐行分析了独占锁的获取操作, 本篇文章我们来看看独占锁的释放。如果前面的锁的获取流程你已经趟过一遍了, 那锁的释放部分就很简单了, 这篇文章我们直接开始看源码. 开始之前先提一句, JAVA的内置锁…
二分查找、二分边界查找算法的模板代码总结
前言 二分查找作为程序员的一项基本技能,是面试官最常使用来考察程序员基本素质的算法之一,也是解决很多查找类题目的常用方法,它可以达到O(log n)的时间复杂度。 一般而言,当一个题目出现以下特性时,你就应该立即联想到它…
线程间的同步与通信(1)——同步代码块Synchronized
前言 同步代码块(Synchronized Block) 是java中最基础的实现线程间的同步与通信的机制之一,本篇我们将对同步代码块以及监视器锁的概念进行讨论。 什么是同步代码块(Synchronized Block)…
线程间的同步与通信(5)——ReentrantLock源码分析
前言 上一篇 我们学习了lock接口,本篇我们就以ReentrantLock为例,学习一下Lock锁的基本的实现。我们先来看看Lock接口中的方法与ReentrantLock对其实现的对照表: Lock 接口 Reent…
线程间的同步与通信(2)——wait, notify, notifyAll
前言 上一篇文章我们讲了java的同步代码块, 这一篇我们来看看同步代码块之间的协作与通信. 阅读本篇前你需要知道什么是同步代码块, 什么是监视器锁, 还不是很了解的同学建议先去看一看上一篇文章. 本文的源码基于JDK1…
Docker volume 挂载时文件或文件夹不存在
背景介绍 docker volume 可以使我们在启动docker容器时,动态的挂载一些文件(如配置文件), 以覆盖镜像中原有的文件,但是,挂载一个主机上尚不存在的文件夹或者文件到容器中会怎样呢?LZ在工作中就遇到了这样…
逐行分析AQS源码(3)——共享锁的获取与释放
前言 前面两篇我们以ReentrantLock为例了解了AQS独占锁的获取与释放,本篇我们来看看共享锁。由于AQS对于共享锁与独占锁的实现框架比较类似,因此如果你搞定了前面的独占锁模式,则共享锁也就很容易弄懂了。 共享锁…
线程间的同步与通信(7)——CyclicBarrier源码分析
前言 上一篇 我们学习了基于AQS共享锁实现的CountDownLatch,本篇我们来看看另一个和它比较像的并发工具CyclicBarrier。 与CountdownLatch的区别 将count值递减的线程 在Coun…
线程间的同步与通信(8)——Semaphore源码分析
前言 Semaphore(信号量)也是常用的并发工具之一,它常常用于流量控制。通常情况下,公共的资源常常是有限的,例如数据库的连接数。使用Semaphore可以帮助我们有效的管理这些有限资源的使用。 Semaphore的…