网站首页 > 精选教程 正文
CPU三级缓存
相对于内存IO,CPU运算速度很快;为了提升CPU计算存取速度,内存与CPU之间设置了三级缓存。三级没有理论基础,只有工业验证。为了提升读取数据效率,每次读取指定的数据块。比如 Inter 一次读取64字节,而不是一个bit一个bit读取。
三级缓存如下图所示:
伪共享问题
Java中一个 long 数字占用8字节;一个数据块最多可以同时存放4个long数字。内存中,如果同一个数据块中,存放了多个 long 数据;被多个CPU加载到了自己私有的 L1 级缓存中,同时做了修改;这样就出现了数据不一致的情况。这就是伪共享的问题。
当然,计算机使用了某些策略(硬件层面可以使用总线控制,软件层面可以使用MESI协议),使得CPU的修改对其他CPU是可见的,但这些策略肯定影响了数据的处理效率。
【Java】验证伪共享的效率
试验方法:
假设有两个long型变量x、y,使用关键字:volatile 保证其可见性。启动两个线程分别对这两个变量进行大规模赋值操作,记录操作耗时情况。
对比操作:对两个变量分别加上注解@sun.misc.Contended ,并且JVM启动参数设置添加:-XX:-RestrictContended。这样保证两个变量不在同一个数据块上,不存在伪共享问题。记录相同规模赋值操作的耗时情况。
@sun.misc.Contended
volatile long x;
@sun.misc.Contended
volatile long y;
public static void main(String[] args) throws InterruptedException {
T05_Contended t = new T05_Contended();
/**
* 不用注解Contended
* 100次均值: 205ms
*
* 使用注解Contended
* 100次均值: 84ms
* 注意:启动JVM加入参数-XX:-RestrictContended
* 注解Contended才能生效
*/
long sum = 0;
for(int x = 0; x < 100; x++) {
// 创建线程
Thread t1 = new Thread(() -> {
for(long i = 0; i < 1_0000_0000L; i++) {
t.x = i;
}
});
Thread t2 = new Thread(() -> {
for(long i = 0; i < 1_0000_0000L; i++) {
t.y = i;
}
});
// 执行赋值
long start = System.currentTimeMillis();
t1.start();
t2.start();
t1.join();
t2.join();
long end = System.currentTimeMillis();
// 计算总耗时
sum = sum + (end - start);
}
System.err.println(t.x + " : " + t.y);
System.err.println((sum / 100));
}
猜你喜欢
- 2024-11-11 RuoYi若依系统的验证码如何替换为更美观的EasyCaptcha
- 2024-11-11 Azure上的Java:云原生身份验证 azure java
- 2024-11-11 Java之HTTP请求权限验证 java之http请求权限验证怎么办
- 2024-11-11 java短信验证平台_JAVA实现利用第三方平台发送短信验证码
- 2024-11-11 OAuth2+JWT 实现权限验证 oauth2权限控制
- 2024-11-11 Java 的业务逻辑验证框架 之-fluent-validator
- 2024-11-11 java 生成4位短信验证码方法 java+生成4位短信验证码方法有哪些
- 2024-11-11 Java策略模式实现动态验证不同来源的数据
- 2024-11-11 Java安全编程:公钥加密和私钥签名的实践指南
- 2024-11-11 Python和Java生成动态随机验证码 生成随机验证码,python
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)