刚刚看了一下synchronized和volatile的区别,这里做一下笔记。 多线程中内存是如何分配的? 分为主内存和线程内存,当线程与其他线程共享一个变量时,便会把主内存的变量复制到线程内存中去。当发生对变量的修改时...
分类:
编程语言 时间:
2015-07-11 10:42:23
阅读次数:
133
JMM 1、内存模型的抽象。本地内存是JMM的一个抽象概念,并不是真实存在,它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。 2、内存可见性问题? ? 3、重排序编译器优化重排序 编译器再不改变单线程程序语义的前提下,可重新安排语句执行顺序。指令级并行重排序 现代处理器采用了指...
分类:
编程语言 时间:
2015-06-29 06:20:10
阅读次数:
247
在Java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享。局部变量、方法定义参数和异常处理器参数不会在线程之间共享,他们不会有内存可见性问题,也不受内存模型的影响。Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从...
分类:
编程语言 时间:
2015-06-02 14:48:26
阅读次数:
135
一、JAVA内存模型简介
JAVA Merory Model描述了JAVA程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。
所有的变量都保存在主内存中,但是每个线程都有自己的独立工作内存,保存该线程使用到的变量的一个副本。
两条规定
1.线程对共享变量的操作只能在独立的工作内存中进行,不能在主内存中直接读写;
2.不...
分类:
编程语言 时间:
2015-05-28 21:38:07
阅读次数:
262
上一篇博客JAVA并发编程3_线程同步之synchronized关键字中讲解了JAVA中保证线程同步的关键字synchronized,其实JAVA里面还有个较弱的同步机制volatile。volatile关键字是JAVA中的轻量级的同步机制,用来将变量的更新操作同步到其他线程。从内存可见性的角度来说,写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块。
旧...
分类:
编程语言 时间:
2015-05-26 18:48:18
阅读次数:
270
可见性:一个线程对共享变量值的修改,能够及时的被其它线程看到。
共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。
所有的变量都存储在主内存中
JAVA内存模型(JVM)
所有的变量都存储在主内存中每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝)
两条规定...
分类:
编程语言 时间:
2015-04-06 15:46:53
阅读次数:
271
同步机制可以保证原子操作和内存可见性,但是同步机制对变量的访问性能是我们不得不考虑的问题,java语言提供了一种弱同步机制,volatile变量。
它的原理大致是这样的,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的...
分类:
编程语言 时间:
2015-02-01 23:21:33
阅读次数:
316
前三篇我们主要说了多线程访问共享可变状态时需要进行正确的同步处理,保证同一时刻只有一个线程访问相同的数据,我们使用synchronized关键字来实现原子性操作。今天我们在来认识一下同步的另一个重要方面:内存可见性,这个概念其实很好理解,就是保证在同一个时刻,共享可变状态对访问它的线程呈现出自己最新的状态变化。
我们经常遇到的情景是这样的,一个全局变量计数器,一个线程负责更新该数值,另一些线程获...
分类:
编程语言 时间:
2015-02-01 16:12:17
阅读次数:
240
《java并发编程实战》读书摘要birdhack2015年1月2日对象的共享JAVA并发编程实战读书笔记 我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键之synchronized只能用于实现原子性或者确定临界区。同步还有另一个重要的方面:内存可见性。.....
分类:
编程语言 时间:
2015-01-15 01:44:52
阅读次数:
136