撰写于    浏览:891 次  分类: 数据结构
在jdk1.8中,数组的遍历,可以使用lambda的形式,但是要注意要用包装类,而不是基本类型import java.util.Arrays; public class ArrayDemo { public static void main(String[] args) { Integer array1[...]

撰写于    浏览:36540 次  分类: disruptor研究
ArrayBlockingQueue的问题ArrayBlockingQueue在实际使用过程中,会因为加锁和伪共享等出现严重的性能问题,我们下面来分析一下。加锁现实编程过程中,加锁通常会严重地影响性能。线程会因为竞争不到锁而被挂起,等锁被释放的时候,线程又会被恢复,这个过程中存在着很大的开销,并且通常会有较长时间的中断,因为当一个线程正在等待锁时,[...]

撰写于    浏览:410 次  分类: disruptor研究
背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了[...]

撰写于    浏览:258 次  分类: Java8基础知识
1 线程public class Test { public static void main(String[] args) { // Java8之前: new Thread(new Runnable() { public void run() { [...]

撰写于    浏览:1774 次  分类: 多线程与并发,一针见血20点
应用程序这个词包括两个类别:应用和程序。应用面向的对象是人,程序面向的对象是CPU。应用=加班+框架,程序=数据结构+算法多线程与并发研究的本质就是在研究程序。

撰写于    浏览:622 次  分类: 多线程与并发,一针见血20点
数据在哪里存在呢?只在内存吗?不是的。数据在内存中存在,但是当用的时候会加载到CPU的寄存器里面。内存和寄存器是两个地方,从而出现了新的名词:内存可见性和寄存器可见性。为什么叫内存可见性呢?感觉很奇怪的名字。其实,明白以下道理就不奇怪了:数据的流动过程是:内存->寄存器->计算器很多时候,数据从内存地址读取到寄存器里面,后面的计算过程中[...]

撰写于    浏览:677 次  分类: 一针见血20点
synchronized代码块儿里面的变量都实现了内存可见性。内存可见性的底层是CPU的指令实现的。viotile修饰的是变量,它的作用也是实现内存可见性,底层用的用的同一个CPU指令。可以这样理解:synchronized里面的变量都是viotile修饰的。我们都用过synchronized,但是用viotile机会很少,其实换个角度想想,syn[...]

撰写于    浏览:2246 次  分类: 多线程与并发
关于ThreadLocalThreadLocal类并不java并发包里面的一个类,而是java.lang包里面的一个使用频次并不是非常高的一个类,尽量它不在并发包里面,但它的设计用途却可以用来规避一些同步问题:其提供了一个线程副本的成员变量,从而在一些情况下可以巧妙避开并发问题。我们知道在多线程情况下对共享变量的修改,如果不采用任何同步策略,那么结[...]

撰写于    浏览:230 次  分类: 多线程与并发
Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),ExecutorService:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法AbstractExecutor[...]

撰写于    浏览:199 次  分类: 多线程与并发
Java里,每个线程都有自己的ThreadLocalMap,里边存着自己私有的对象。Map的Entry里,key为ThreadLocal对象,value即为私有对象T。在spring MVC中,常用ThreadLocal保存当前登陆用户信息,这样线程在任意地方都可以取到用户信息了。public class UserContext { pri[...]