事情由来是对于Log4j2中存在两种异步处理日志的方式,AsyncAppender和AsyncLogger两种,一个是基于BlockingQueue实现,一个是基于Disruptor实现的。。
而Disruptor是无锁的方式,环形队列,对于队首尾都是采用数据padding的方式解决伪共享的问题。。
对于CPU的伪共享参见:http://coderplay.iteye.com/blog/1485760,http://coderplay.iteye.com/blog/1486649
在伪共享的方面也解释了为什么对于二维数组为什么,先行后列,比先列后行的遍历快很多。。
对于多核多线程编程的应用中,这种伪共享的现象很多。。。
对于java中的存在的这种现象可以参见:https://www.ibm.com/developerworks/java/library/j-codetoheap/index.html
大神们已经做了很浅显的解释,我在这里只是为了Mark一下。
由此也引出了另一个有趣的集合框架:WeakHashMap 。。特别适合缓存系统。
关于WeakHashMap的相关用法介绍可以参见:http://www.importnew.com/23182.html
其中说到比较有意思的地方就是WeakReference不会影响,GC的操作,也就是说可达性分析的话应该会直接跳过WeakReference。。
在IBM对于系统中使用的集合框架做统计的时候这个集合竟然排名第二,可见其威力也是挺厉害的,,目前在接触的系统里面还没有接触到这类用发。。。》》》
Collection type | Number of instances | Total collection overhead (MB) |
---|---|---|
Hashtable | 262,234 | 26.5 |
WeakHashMap | 19,562 | 12.6 |
HashMap | 10,600 | 2.3 |
ArrayList | 9,530 | 0.3 |
HashSet | 1,551 | 1.0 |
Vector | 1,271 | 0.04 |
LinkedList | 1,148 | 0.1 |
TreeMap | 299 | 0.03 |