线程封闭与ThreadLocal

访问共享数据,通常需要使用同步来保证变量的并发安全性.避免同步的方式就是不共享数据,如果数据只有单线程访问则不需要同步.这叫做线程封闭.

线程封闭分为两种方式

栈封闭 通常我们使用的局部变量,天然具备线程封闭性,它没有被其他地方访问,方法结束后即不可访问.

ThreadLocal类 它提供了get和set等方法,这些方法为每个使用变量的线程存储一份独立的副本.因此get总是返回由当前执行线程在调用set时设置的最新值.

阅读全文>>

线程池实现

线程池状态和数量

ThreadPoolExecutor拥有如下状态 , 它控制着线程是否接收新任务以及当前在队列中或者执行中的任务如何结束.

RUNNING: 接收新的任务,新建或者放入任务队列

SHUTDOWN: 不接收新的任务,但是会执行任务队列的中任务

STOP: 不接收新的任务,不会执行任务队列中的任务,并且停止在执行中的任务

TIDYING: 任务执行结束,workerCountOf返回 0 ,线程池状态设置为此状态,并执行钩子函数.

TERMINATED: terminated() 结束

阅读全文>>

任务执行与线程池

任务通常是一些抽象的离散的工作单元,我们把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,以及提供一种自然的并行工作结构来提升并发性.而并发执行任务在Java体系里面就是线程.

阅读全文>>

高效队列框架Disruptor

Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题.2010年在QCon演讲后,获得了业界关注. 2011年,Martin Fowler大神专门撰写长文对其进行介绍.由于熟悉程度问题,只能科普介绍一下,介绍之前可以先了解下ArrayBlockingQueue存在的一些问题.

阅读全文>>

阻塞队列

阻塞队列(BlockingQueue)提供了可阻塞的put和take方法,以及支持定时的offer和pull.如果队列已经满了,那么put方法将阻塞到有空间可用;如果队列为空那么take方法将阻塞到有元素可用.

阅读全文>>