脚本宝典收集整理的这篇文章主要介绍了JAVA虚拟机23---JAVA内存模型,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
1.amdahl定律和摩尔定律
5.3主内存和工作内存交互的8中操作
lock 主用于主内存 unlock 作用于主内存 read + load 主内存变量进入工作内存,放入变量副本(这两个命令必须配合使用,不允许单独使用,但是这两个命令中间可以加入其它命令) use 工作内存内变量的值交给执行引擎 assign 把执行引擎的值赋值给工作内存的变量 store + write 工作内存变量写入主内存的变量中(这两个命令必须配合使用,不允许单独使用,但是这两个命令中间可以加入其它命令) assign 发生了,才能,也是必须发生store + write 新变量只能在主内存诞生(对一个变量实施use、store操作之前,必须先执行assign和load操作) 同时只能有一个线程对变量进行一次或多次lock,多少次lock就需要该线程多少次unlock才能解锁 lock发生时,清空工作内存中次变量副本的值 unlock发生时,工作内存的副本变量必须同步到主内存
package com.ruoyi.weixin.user.test;
public class VolatileTest {
public static volatile int race = 0;
public static void increase() {
race++;
}
private static final int ThrEADS_COUNT = 20;
public static void main(String[] args) {
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@override
public void run() {
for (int i = 0; i < 10000; i++) {
increase();
}
}
});
threads[i].start();
}// 等待所有累加线程都结束
while (Thread.activeCount() > 2) Thread.yield();
System.out.println(race);
}
}
执行上面的代码,发现打印的结果并不是200000,说明线程并不安全。
javap查看字节码
public class Singleton { private volatile static Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } public static void main(String[] args) { Singleton.getInstance(); } }
6.4 volatile变量定义的特殊规则
假定T表示一个线程,V和W分别表示两个volatile型变量,那么在进行read、load、use、assign、store和write操作时需要满足如下规则以上是脚本宝典为你收集整理的JAVA虚拟机23---JAVA内存模型全部内容,希望文章能够帮你解决JAVA虚拟机23---JAVA内存模型所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。