java内存模型的理解
2016-05-08 14:27
573 查看
之前一直对主内存和工作内存之间的通信,不是很清楚。今天终于下定决心,细细看看这方面的知识,个人感觉一下几篇文章介绍的浅显易懂。现附上链接
1.介绍了java内存模型的基础知识:http://www.infoq.com/cn/articles/java-memory-model-1/#anch94004
http://www.cnblogs.com/dingyingsi/p/3760447.html
2.针对几个问题解释
①什么叫内存可见性:
http://zys0523.iteye.com/blog/1381526
②voliate关键字怎么做到了内存可见性:
http://www.infoq.com/cn/articles/java-memory-model-4/
小结:这几篇文章都围绕着两个特性在介绍,①原子性②可见性
下面再附上网上关于AtomicInteger的理解,个人觉得不错
public final int incrementAndGet() {
for (;;) {
int current = get();//1
int next = current + 1;//2
if (compareAndSet(current, next))//3
return next;
}
}
以上是源代码,这个操作相当于i++
如果有两个AtomicInteger,i1和i2,i1执行到步骤2,自己栈中的值变成5,没有执行步骤3,因为步骤3才是是写操作,所以此时i1自己的栈中的值是加1后的5,但是主内存中的值还是4,此时i2通过get()得到当前主内存的值,4,进行加1操作,变成5.
到此,i1和i2在他们各自的栈中都是5,现在他们把5这个值写回主内存,i1成功了,它执行的是compareAndSet(4, 5);
i2在执行步骤3的时候,执行的也是compareAndSet(4, 5);但是,此时主内存中第一个参数对应的值已经被i1改成5,所以此次操作失败,i2进入第二个循环,通过步骤1获得当前值5,然后加1,所以最后i2把值变成了6.
compareAndSet(current, next)是一个底层cpu指令,让cpu线程安全的增加一个值,但是可能会失败,返回类型是boolean
整个方法本身并不是线程安全的,但通过compareAndSet方法,可以达到安全操作的效果。
从中可以看出,如果并发量大,则循环次数会显著增多,从而会大量占用cpu时间,
不过由于没有加线程同步锁,整个操作的线程开销比较小的,很多时候也会提高线程执行的效率。
1.介绍了java内存模型的基础知识:http://www.infoq.com/cn/articles/java-memory-model-1/#anch94004
http://www.cnblogs.com/dingyingsi/p/3760447.html
2.针对几个问题解释
①什么叫内存可见性:
http://zys0523.iteye.com/blog/1381526
②voliate关键字怎么做到了内存可见性:
http://www.infoq.com/cn/articles/java-memory-model-4/
小结:这几篇文章都围绕着两个特性在介绍,①原子性②可见性
下面再附上网上关于AtomicInteger的理解,个人觉得不错
public final int incrementAndGet() {
for (;;) {
int current = get();//1
int next = current + 1;//2
if (compareAndSet(current, next))//3
return next;
}
}
以上是源代码,这个操作相当于i++
如果有两个AtomicInteger,i1和i2,i1执行到步骤2,自己栈中的值变成5,没有执行步骤3,因为步骤3才是是写操作,所以此时i1自己的栈中的值是加1后的5,但是主内存中的值还是4,此时i2通过get()得到当前主内存的值,4,进行加1操作,变成5.
到此,i1和i2在他们各自的栈中都是5,现在他们把5这个值写回主内存,i1成功了,它执行的是compareAndSet(4, 5);
i2在执行步骤3的时候,执行的也是compareAndSet(4, 5);但是,此时主内存中第一个参数对应的值已经被i1改成5,所以此次操作失败,i2进入第二个循环,通过步骤1获得当前值5,然后加1,所以最后i2把值变成了6.
compareAndSet(current, next)是一个底层cpu指令,让cpu线程安全的增加一个值,但是可能会失败,返回类型是boolean
整个方法本身并不是线程安全的,但通过compareAndSet方法,可以达到安全操作的效果。
从中可以看出,如果并发量大,则循环次数会显著增多,从而会大量占用cpu时间,
不过由于没有加线程同步锁,整个操作的线程开销比较小的,很多时候也会提高线程执行的效率。
相关文章推荐
- java总结------static
- java泛型
- Java实现算法之快速排序
- 重新学javaweb---过滤器 Filter基础知识
- 20145236 《Java程序设计》实验五实验报告
- 20145236 《Java程序设计》 第十周学习总结
- struts2进行多文件上传
- java设计模式之模板模式
- java中的集合类(Collection)中的Set
- java集合11--HashTable源码详解
- Java 中的 static 使用
- SpringMVC拦截器
- 不惑JAVA之JAVA基础 - volatile
- Android Studio中常用设置与快捷键(android studio中Eclipse配置的快捷键)
- Java概念性问题
- JAVA IntelliJ IDEA 导入第三方包
- Java多线程系列--“JUC线程池”02之 线程池原理(一)
- Java和js 日期相减
- JUC (Java Util Concurrency) 基础内容概述
- Java SQL语句解析——Jsqlparser开源项目