摘要:前言:之前有写过关于重入锁ReentrantLock的解析,而重入锁ReentrantLock的核心在于它的两个锁非公平锁和公平锁的所继承的父类AbstractQueuedSynchronizer,接下来就是关于AbstractQueuedSynchronizer的详解,包括图文、源码。后文Abst
阅读全文
摘要:前言:上一篇单线程池的随笔提到了非固定线程数的线程池,那么本文就以前文为基础,剖析Java线程池中的Executors.newCachedThreadPool()。Executors.newCachedThreadPool(),后文简称为缓存线程池。 ***Executors.newCachedTh
阅读全文
摘要:Java线程池Executors.newSingleThreadExecutor() 前言:本文先就Java线程池 ThreadPoolExecutor 进行分析,然后逐步分析单线程池的源码工作流程 ThreadPoolExecutor的工作流程 我们执行以下代码: ExecutorService
阅读全文
摘要:重入锁ReentrantLock详解 ReentrantLock 实现自AQS队列同步器,其字面意思是可以重复进入的锁,其功能也如其名,在一个同步代码块中,可以多次调用 lock() 进行上锁,当然也需要对其进行多次解锁,才能使同步状态归0,其它线程才能重新获得锁。 重入锁又分为非公平锁和公平锁两种
阅读全文
摘要:CountDownLatch 简介原理 CountDownLatch是由队列同步器实现的。 在构建新的CountDownLatch对象时,需要传入一个大于0的整形int参数。而这个参数就作为队列同步器的state同步状态了。 public CountDownLatch(int count) { if
阅读全文
摘要:一、Lock接口 Lock接口提供了一些方法,比如lock(),tryLock()等方法,像ReentrantLock就是基于队列同步器来实现的 二、AbstractQueuedSynchronizer 1.什么是队列同步器 队列同步器是一个抽象类,提供了实现线程队列获取同步状态的一系列方法(简单理
阅读全文
摘要:一、线程简介 1.线程的概念 系统运行的最小单元 2.为何使用多线程 更好地利用系统资源(处理器多核心),提高响应速度。 3.线程的状态 关于wait和notify: 结果: wait方法会释放锁,sleep则不会 二、启动和终止线程 1.启动线程 1.构建线程 注意:最好给线程初始化名称,方便JV
阅读全文
摘要:Java内存模型 一、Java内存模型的基础 1.并发编程模型的两个关键问题: 两个关键问题,线程之间如何通信和如何同步。两种方式,共享内存和消息传递。Java里线程的通信是通过共享内存,线程的同步是显示进行的,而通信则是隐式进行的。 2.Java内存模型的抽象结构: 实际上就是说Java线程之间的
阅读全文
摘要:Java并发机制的底层实现原理 1.volatile volatile相当于轻量级的synchronized,在并发编程中保证数据的可见性,使用 valotile 修饰的变量,其内存模型会增加一个 Lock 前缀,而这个前缀在多核处理器中带来的效果是: (1)会将处理器缓存行的数据回写到内存中; (
阅读全文
摘要:并发编程的挑战 并发编程的初衷是让程序运行的更快,但是更多的使用多线程真的会让程序变快吗? 1.线程上下文切换 关于线程上下文切换 多个线程在一个处理器里并不是同时进行的,而是非常快速地在线程之间进行切换着运行,所以可以更高效地使用到CPU的性能。 线程上下文切换的开销 然而在低运算量的时候,单线程
阅读全文