前言 上一篇文章我们讲了java的同步代码块, 这一篇我们来看看同步代码块之间的协作与通信. 阅读本篇前你需要知道什么是同步代码块, 什么是监视器锁, 还不是很了解的同学建议先去看一看上一篇文章. 本文的源码基于JDK1…
分类:Java多线程
线程间的同步与通信(3)——浅析synchronized的实现原理
前言 前面两篇文章我们介绍了synchronized同步代码块以及wait和notify机制,大致知道了这些关键字和方法是干什么的,以及怎么用。 但是,知其然,并不知其所以然。 例如: 什么是监视器锁? JAVA中任何对…
线程间的同步与通信(4)——Lock 和 Condtion
前言 前面几篇我们学习了synchronized同步代码块,了解了java的内置锁,并学习了监视器锁的wait/notify机制。在大多数情况下,内置锁都能很好的工作,但它在功能上存在一些局限性,例如无法实现非阻塞结构的…
线程间的同步与通信(5)——ReentrantLock源码分析
前言 上一篇 我们学习了lock接口,本篇我们就以ReentrantLock为例,学习一下Lock锁的基本的实现。我们先来看看Lock接口中的方法与ReentrantLock对其实现的对照表: Lock 接口 Reent…
线程间的同步与通信(6)——CountDownLatch源码分析
前言 CountDownLatch是一个很有用的工具,latch是门闩的意思,该工具是为了解决某些操作只能在一组操作全部执行完成后才能执行的情景。例如,小组早上开会,只有等所有人到齐了才能开;再如,游乐园里的过山车,一次…
线程间的同步与通信(7)——CyclicBarrier源码分析
前言 上一篇 我们学习了基于AQS共享锁实现的CountDownLatch,本篇我们来看看另一个和它比较像的并发工具CyclicBarrier。 与CountdownLatch的区别 将count值递减的线程 在Coun…
线程间的同步与通信(8)——Semaphore源码分析
前言 Semaphore(信号量)也是常用的并发工具之一,它常常用于流量控制。通常情况下,公共的资源常常是有限的,例如数据库的连接数。使用Semaphore可以帮助我们有效的管理这些有限资源的使用。 Semaphore的…
FutureTask源码解析(1)——预备知识
前言 FutureTask 是一个同步工具类,它实现了Future语义,表示了一种抽象的可生成结果的计算。在包括线程池在内的许多工具类中都会用到,弄懂它的实现将有利于我们更加深入地理解Java异步操作实现。 在分析它的源…
FutureTask源码解析(2)——深入理解FutureTask
前言 有了上一篇对预备知识的了解之后,分析源码就容易多了,本篇我们就直接来看看FutureTask的源码。 本文的源码基于JDK1.8。 Future和Task 在深入分析源码之前,我们再来拎一下FutureTask到底…
深入理解HashMap(一): 从源头说起
前言 HashMap我们都不陌生, 也是java面试几乎必问的考点, 本系列我们来深入思考有关HashMap的设计思想和实现细节. HashMap解决了什么问题? 任何数据结构的产生总对应着要解决一个实际的问题, Has…
Docker volume 挂载时文件或文件夹不存在
背景介绍 docker volume 可以使我们在启动docker容器时,动态的挂载一些文件(如配置文件), 以覆盖镜像中原有的文件,但是,挂载一个主机上尚不存在的文件夹或者文件到容器中会怎样呢?LZ在工作中就遇到了这样…
二叉树的前序,中序,后序遍历方法总结
前言 二叉树的前序遍历,中序遍历,后序遍历是面试中常常考察的基本算法,关于它的概念这里不再赘述了,还不了解的同学可以去翻翻LeetCode的解释。 这里,我个人对这三个遍历顺序理解是:前 中 后 这三个词是针对根节点的访…