原子变量

锁机制提供了独占的方法来访问变量,并且对变量的任何修改都会对随后获得这个锁的其他线程可见.但是如果一个线程在休眠或者自旋的时候持有一个锁,那么其他线程便无法执行下去.而非阻塞算法不会受到单个线程失败的影响.对于细粒度的操作,非阻塞算法更高效.它需要借助冲突检查机制来判断更新过程中是否存在来自其他线程的干扰,如果存在则操作失败,并且重试.现代处理器都提供了这种读-改-写(Compare-And-Swap)的指令,来实现这种复杂的并发对象.

阅读全文>>

线程封闭与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存在的一些问题.

阅读全文>>