摘要: happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键。 一.JMM的设计 首先,让我们先分析一下JMM的设计意图。从JMM的设计者的角度,在设计JMM的时候要考虑一下两个关键因素: 1.程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序 阅读全文
posted @ 2017-11-25 11:26 木易森林 阅读(6725) 评论(3) 推荐(0) 编辑
摘要: 一.final域的重排序规则 对于final域,编译器和处理器要遵循两个重拍序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的应用,与随后初次读这个final域,这两个操作之间不能重排 阅读全文
posted @ 2017-11-25 10:58 木易森林 阅读(3428) 评论(1) 推荐(2) 编辑
摘要: 所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间。 基本思想: 这此我用一个简单的例子来详细介绍BitMap算法的原理。假设我们要对0-7内的5个元素(4,7,2,5,3)进行排序(这里假设元 阅读全文
posted @ 2017-11-23 16:45 木易森林 阅读(46776) 评论(7) 推荐(0) 编辑
摘要: 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢。 布隆过滤器是一种空间效率很高的随机数据结构,Bl 阅读全文
posted @ 2017-11-23 12:03 木易森林 阅读(1310) 评论(0) 推荐(0) 编辑
摘要: 提到了CAS操作存在问题,就是在CAS之前A变成B又变回A,CAS还是能够设置成功的,什么场景下会出现这个问题呢?查了一些资料,发现在下面的两种情况下会出现ABA问题。 1.A最开始的内存地址是X,然后失效了,有分配了B,恰好内存地址是X,这时候通过CAS操作,却设置成功了 这种情况在带有GC的语言 阅读全文
posted @ 2017-11-21 21:23 木易森林 阅读(5666) 评论(0) 推荐(0) 编辑
摘要: 在多线程的并发编程中synchronized和volatile都扮演着重要的角色。volatile是轻量级的synchronized,它在多处理器的开发中保证了共享变量的可见性,可见性的意思是当一个线程修改一个共享变量时,另一个线程能够读取到这个修改值。如果volatile变量使用恰当的话,他会比s 阅读全文
posted @ 2017-11-21 20:59 木易森林 阅读(467) 评论(0) 推荐(0) 编辑
摘要: 当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同。比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2。这是因为,可能在A线程和B线程执行的时候拿到的i的值都是1,这就是线程不安全的更新操作,通常我们会使用s 阅读全文
posted @ 2017-11-21 19:29 木易森林 阅读(15380) 评论(1) 推荐(1) 编辑
摘要: Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换。它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据。两个线程通过exchange方法交换数据,如果一个线程执行exchange方法,它就会等待另一个线程执行exchange方法,当两个线程都到达了同步点,这两个线程就可 阅读全文
posted @ 2017-11-18 12:02 木易森林 阅读(485) 评论(0) 推荐(0) 编辑
摘要: Semaphore(信号量)使用来控制通知访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 我们可以这么理解Semaphore,比如一个厕所只有6个坑,同时只能满足6个人上厕所(变态除外),其他人想蹲坑,只能排队等待,如果有人从厕所出来,后面的一个人就可以进去。在这个例子中人就 阅读全文
posted @ 2017-11-18 11:44 木易森林 阅读(1856) 评论(0) 推荐(0) 编辑
摘要: CyclicBarrier的字面意思是可以循环使用的Barrier,它要做的事情是让一个线程到达一个Barrier的时候被阻塞,直到最后一个线程到达Barrier,屏障才会放开,所有被Barrier拦截的线程才会继续运行。 CyclicBarrier的默认的构造器是CyclicBarrier(int 阅读全文
posted @ 2017-11-18 11:07 木易森林 阅读(432) 评论(0) 推荐(0) 编辑