@sun.misc.Contended避免伪共享(false sharing)
来源:互联网 发布:php $a=array_pop 编辑:程序博客网 时间:2024/06/16 21:51
转载自:http://www.myexception.cn/program/1630142.html
Java8中使用sun.misc.Contended注解来避免伪共享(false sharing)。关于伪共享这个概念,可以先参照http://ifeve.com/falsesharing/
伪共享的例子:
如果有两个VolatileLong对象,会被load到同一个缓存行里面,如果一个线程要修改对象1,另一个线程同时要修改对象2,此时就要面对伪共享问题(core1对缓存行中对象1的修改,导致core2中同一缓存行失效,即缓存的对象2需要重新load)。
jdk6中的解决办法:
上面的方式也就是long padding来避免伪共享,使用无关数据来填充缓存行,使得两个VolatileLong对象不会load到同一个缓存行里面。无锁并发框架Disruptor正是采用的这种方式。
long padding的解决办法不怎么优雅,并且在jdk7某个版本以后能会优化掉long padding,详细参考http://ifeve.com/false-sharing-java-7/。但是java8已经给出了官方的解决办法,就是sun.misc.Contended注解。
这里,JVM就不会将被Contended注解的两个VolatileLong对象load到同一个缓存行里面。要注意的是user classpath使用此注解默认是无效的,需要在jvm启动时设置-XX:-RestrictContended。(不太理解。。。经测试,自己应用程序的sun.misc.Contended注解的类需要-XX:-RestrictContended才能生效,是不是对jdk源码中的sun.misc.Contended不需要上述注解就可以生效了?)
jdk8中有很多地方已经使用了sun.misc.Contended:
java/util/concurrent/ConcurrentHashMap.java
java/util/concurrent/Exchanger.java
Java8中使用sun.misc.Contended注解来避免伪共享(false sharing)。关于伪共享这个概念,可以先参照http://ifeve.com/falsesharing/
伪共享的例子:
如果有两个VolatileLong对象,会被load到同一个缓存行里面,如果一个线程要修改对象1,另一个线程同时要修改对象2,此时就要面对伪共享问题(core1对缓存行中对象1的修改,导致core2中同一缓存行失效,即缓存的对象2需要重新load)。
jdk6中的解决办法:
上面的方式也就是long padding来避免伪共享,使用无关数据来填充缓存行,使得两个VolatileLong对象不会load到同一个缓存行里面。无锁并发框架Disruptor正是采用的这种方式。
long padding的解决办法不怎么优雅,并且在jdk7某个版本以后能会优化掉long padding,详细参考http://ifeve.com/false-sharing-java-7/。但是java8已经给出了官方的解决办法,就是sun.misc.Contended注解。
这里,JVM就不会将被Contended注解的两个VolatileLong对象load到同一个缓存行里面。要注意的是user classpath使用此注解默认是无效的,需要在jvm启动时设置-XX:-RestrictContended。(不太理解。。。经测试,自己应用程序的sun.misc.Contended注解的类需要-XX:-RestrictContended才能生效,是不是对jdk源码中的sun.misc.Contended不需要上述注解就可以生效了?)
jdk8中有很多地方已经使用了sun.misc.Contended:
java/util/concurrent/ConcurrentHashMap.java
java/util/concurrent/Exchanger.java
阅读全文
0 0
- Java8中用sun.misc.Contended避免伪共享(false sharing)
- Java8中用sun.misc.Contended避免伪共享(false sharing)
- @sun.misc.Contended避免伪共享(false sharing)
- Java8中用sun.misc.Contended避免伪共享(false sharing)
- @sun.misc.Contended避免伪共享(false sharing)
- 伪共享false sharing
- 伪共享(False Sharing)
- 伪共享(False Sharing)
- 伪共享(False Sharing)
- 伪共享(False Sharing)
- 伪共享(False Sharing)
- 伪共享(False Sharing)
- 内存伪共享(False Sharing)
- 多线程伪共享(false sharing)问题分析
- 多线程伪共享(false sharing)问题分析
- Java 伪共享(False Sharing)
- 多线程伪共享(false sharing)问题分析
- 【并发】伪共享 —— False Sharing
- LeetCode--Sum Root to Leaf Numbers(Python)
- thread
- [自制工具]实现自动推送Hexo博客文章至百度
- Oracle报错ORA-12516 TNS:listener could not find available handler with matching protocol stack
- linux nmon 使用
- @sun.misc.Contended避免伪共享(false sharing)
- Word2003入门动画教程51:强大的查找文本功能
- java对象导论,个人对java对象的理解
- mac下android studio的快捷键
- JQuery入门
- SQL基础基础教程(四)算术与逻辑运算符
- 15、观察者模式(Observer)
- instanceof的作用主要是判断传参的类型
- hdu 2993 斜率问题,但是不是DP