二分查找、二分边界查找算法的模板代码总结

2018-10-29
阅读 11 分钟
40.2k
二分查找作为程序员的一项基本技能,是面试官最常使用来考察程序员基本素质的算法之一,也是解决很多查找类题目的常用方法,它可以达到O(log n)的时间复杂度。

二叉树的前序,中序,后序遍历方法总结

2018-10-15
阅读 12 分钟
49.2k
这里,我个人对这三个遍历顺序理解是:前 中 后 这三个词是针对根节点的访问顺序而言的,即前序就是根节点在最前根->左->右,中序是根节点在中间左->根->右,后序是根节点在最后左->右->根。

FutureTask源码解析(2)——深入理解FutureTask

2018-09-30
阅读 24 分钟
14k
前言 系列文章目录 有了上一篇对预备知识的了解之后,分析源码就容易多了,本篇我们就直接来看看FutureTask的源码。 本文的源码基于JDK1.8。 Future和Task 在深入分析源码之前,我们再来拎一下FutureTask到底是干嘛的。人如其名,FutureTask包含了Future和Task两部分。 我们上一篇说过,FutureTask实现了RunnableFuture...

FutureTask源码解析(1)——预备知识

2018-09-28
阅读 6 分钟
5.7k
FutureTask 是一个同步工具类,它实现了Future语义,表示了一种抽象的可生成结果的计算。在包括线程池在内的许多工具类中都会用到,弄懂它的实现将有利于我们更加深入地理解Java异步操作实现。

线程间的同步与通信(8)——Semaphore源码分析

2018-09-27
阅读 9 分钟
5.1k
Semaphore(信号量)也是常用的并发工具之一,它常常用于流量控制。通常情况下,公共的资源常常是有限的,例如数据库的连接数。使用Semaphore可以帮助我们有效的管理这些有限资源的使用。

线程间的同步与通信(7)——CyclicBarrier源码分析

2018-09-26
阅读 10 分钟
5k
在CountDownLatch中,执行countDown方法的线程和执行await方法的线程不是一类线程。例如,线程M,N需要等待线程A,B,C,D,E执行完成后才能继续往下执行,则线程A,B,C,D,E执行完成后都将调用countDown方法,使得最后count变为了0,最后一个将count值减为0的线程调用的tryReleaseShared方法会成功返回true,从而调用doReleas...

线程间的同步与通信(6)——CountDownLatch源码分析

2018-09-25
阅读 8 分钟
7.5k
CountDownLatch是一个很有用的工具,latch是门闩的意思,该工具是为了解决某些操作只能在一组操作全部执行完成后才能执行的情景。例如,小组早上开会,只有等所有人到齐了才能开;再如,游乐园里的过山车,一次可以坐10个人,为了节约成本,通常是等够10个人了才开。CountDown是倒数计数,所以CountDownLatch的用法通常...

线程间的同步与通信(5)——ReentrantLock源码分析

2018-09-24
阅读 13 分钟
5.8k
上一篇 我们学习了lock接口,本篇我们就以ReentrantLock为例,学习一下Lock锁的基本的实现。我们先来看看Lock接口中的方法与ReentrantLock对其实现的对照表:

逐行分析AQS源码(4)——Condition接口实现

2018-09-20
阅读 33 分钟
13.8k
本篇文章是基于线程间的同步与通信(4)——Lock 和 Condtion 这篇文章写的,在那篇文章中,我们分析了Condition接口所定义的方法,本篇我们就来看看AQS对于Condition接口的这些接口方法的具体实现。

线程间的同步与通信(4)——Lock 和 Condtion

2018-09-19
阅读 6 分钟
7k
前面几篇我们学习了synchronized同步代码块,了解了java的内置锁,并学习了监视器锁的wait/notify机制。在大多数情况下,内置锁都能很好的工作,但它在功能上存在一些局限性,例如无法实现非阻塞结构的加锁规则等。为了拓展同步代码块中的监视器锁,java 1.5 开始,出现了lock接口,它实现了可定时、可轮询与可中断的锁...

逐行分析AQS源码(3)——共享锁的获取与释放

2018-09-18
阅读 11 分钟
18k
前面两篇我们以ReentrantLock为例了解了AQS独占锁的获取与释放,本篇我们来看看共享锁。由于AQS对于共享锁与独占锁的实现框架比较类似,因此如果你搞定了前面的独占锁模式,则共享锁也就很容易弄懂了。

Thread类源码解读(3)——线程中断interrupt

2018-08-20
阅读 11 分钟
9.2k
前言 系列文章目录 线程中断是一个很重要的概念,通常,取消一个任务的执行,最好的,同时也是最合理的方法,就是通过中断。 本篇我们主要还是通过源码分析来看看中断的概念。 本文的源码基于JDK1.8 Interrupt status & InterruptedException java线程的中断机制为我们提供了一个契机,使被中断的线程能够有机会从当...

系列文章目录

2018-08-18
阅读 1 分钟
30k
大家好,笔者是今年才开始写博客的,写作的初衷主要是想记录和分享自己的学习经历。因为写作的时候发现,为了弄懂一个知识,不得不先去了解另外一些知识,这样以来,为了说明一个问题,就要把一系列知识都了解一遍,写出来的文章就特别长。

Thread类源码解读(2)——线程状态及常用方法

2018-08-17
阅读 15 分钟
6.9k
前言 系列文章目录 上一篇我们讨论了线程的创建,本篇我们来聊一聊线程的状态转换以及常用的几个比较重要的方法。 本篇依然是通过源码分析来了解这些知识。 本文源码基于jdk1.8 。 阅读完本文,你应当有能力回答以下常见面试题: 线程有哪几种状态以及各种状态之间的转换? Thread.sleep() 与 Thread.currentThread().sl...

Thread类源码解读(1)——如何创建和启动线程

2018-08-16
阅读 9 分钟
7.3k
谈到线程同步与通信,线程本身的概念是绕不开的,而进程和线程的概念已经是老生常谈的话题了,一些基本的概念本文就不再讨论了,本篇仅仅致力于通过源码,了解线程的构造与启动,从而更深入的了解线程。

线程间的同步与通信(3)——浅析synchronized的实现原理

2018-08-15
阅读 4 分钟
8k
前言 系列文章目录 前面两篇文章我们介绍了synchronized同步代码块以及wait和notify机制,大致知道了这些关键字和方法是干什么的,以及怎么用。 但是,知其然,并不知其所以然。 例如: 什么是监视器锁? JAVA中任何对象都可以作为锁,那么锁信息是怎么被记录和存储的? 监视器锁是怎样被获取的? 监视器锁是怎样被释放的...

线程间的同步与通信(2)——wait, notify, notifyAll

2018-08-14
阅读 12 分钟
6.1k
前言 上一篇文章我们讲了java的同步代码块, 这一篇我们来看看同步代码块之间的协作与通信. 阅读本篇前你需要知道什么是同步代码块, 什么是监视器锁, 还不是很了解的同学建议先去看一看上一篇文章. 本文的源码基于JDK1.8 系列文章目录 概述 在Java中, 我们可以使用 wait() wait(long timeout) wait(long timeout, int nan...

线程间的同步与通信(1)——同步代码块Synchronized

2018-08-12
阅读 7 分钟
8.9k
同步代码块(Synchronized Block) 是java中最基础的实现线程间的同步与通信的机制之一,本篇我们将对同步代码块以及监视器锁的概念进行讨论。

深入理解HashMap(五): 关键源码逐行分析之put

2018-07-31
阅读 4 分钟
6.3k
上一篇我们讨论了HashMap的扩容操作, 提到扩容操作发生在table的初始化或者table大小超过threshold后,而这两个条件的触发基本上就发生在put操作中。

深入理解HashMap(四): 关键源码逐行分析之resize扩容

2018-07-30
阅读 7 分钟
16.7k
上一篇我们说明了HashMap的构造函数, 谈到构造函数中并不会初始化table 变量, table 变量是在 resize过程中初始化的.

深入理解HashMap(三): 关键源码逐行分析之构造函数

2018-07-29
阅读 4 分钟
5.9k
前言 系列文章目录 上一篇我们说明了HashMap的hash算法, 说到HashMap在构造时会自动将table设为2的整数次幂. 本篇我们就来聊聊HashMap的构造函数. 本文的源码基于 jdk8 版本. 构造函数 HashMap 共有四个构造函数 {代码...} 不知道大家发现了没有, 即使我们在构造函数中指定了initialCapacity, 这个值也只被用来计算 thre...

深入理解HashMap(二): 关键源码逐行分析之hash算法

2018-07-28
阅读 2 分钟
6.7k
前言 系列文章目录 前面我们讨论了HashMap的结构, 接下来几篇我们从源码角度来看HashMap的实现细节. 本篇我们就来聊聊HashMap的hash算法 本文的源码基于 jdk8 版本. hash算法 上一篇文章我们提到, 为了利用数组索引进行快速查找, 我们需要先将 key值映射成数组下标. 因为数组的下标是有限的集合, 所以我们可以先通过hash...

深入理解HashMap(一): 从源头说起

2018-07-27
阅读 4 分钟
7.2k
前言 系列文章目录 HashMap我们都不陌生, 也是java面试几乎必问的考点, 本系列我们来深入思考有关HashMap的设计思想和实现细节. HashMap解决了什么问题? 任何数据结构的产生总对应着要解决一个实际的问题, HashMap的产生要解决问题就是: 如何有效的 存 取 一组 key-vaule 键值对 key-value键值对是最常使用的数据形式, ...

逐行分析AQS源码(2)——独占锁的释放

2018-07-24
阅读 7 分钟
13.2k
上一篇文章 我们逐行分析了独占锁的获取操作, 本篇文章我们来看看独占锁的释放。如果前面的锁的获取流程你已经趟过一遍了, 那锁的释放部分就很简单了, 这篇文章我们直接开始看源码.

逐行分析AQS源码(1)——独占锁的获取

2018-07-23
阅读 19 分钟
22k
AQS(AbstractQueuedSynchronizer)是JAVA中众多锁以及并发工具的基础,其底层采用乐观锁,大量使用了CAS操作, 并且在冲突时,采用自旋方式重试,以实现轻量级和高效地获取锁。

Docker volume 挂载时文件或文件夹不存在

2018-07-18
阅读 2 分钟
29.8k
docker volume 可以使我们在启动docker容器时,动态的挂载一些文件(如配置文件), 以覆盖镜像中原有的文件,但是,挂载一个主机上尚不存在的文件夹或者文件到容器中会怎样呢?LZ在工作中就遇到了这样的问题,故自己实践了一下,记录实验结果如下: