美文网首页
【笔记】深入---java内存模型与线程

【笔记】深入---java内存模型与线程

作者: 张航_8ee7 | 来源:发表于2018-01-30 17:08 被阅读0次

    因为当前我们的cpu相响应特别快,但是数据从内存到操作空间这段过程相对较慢,引入了高性能的高速缓存存储。

    java 内存模型

    如果非要和java的运行数据区域相匹配的话,

    java 线程就是 栈 就是工作内存。 java对象的创建就是在堆也就是主内存。

    java 内存间的交互

    有8种。

    lock,unlock。assign   store write (变量从工作内存到主内存 ) 。 read load use (变量从主内存到工作内存 )。

    lock,unlock 分别是为当前线程加锁或解锁,加锁后的变量,将被标记为线程独享。unlock ,解锁。

    assign    变量在工作内存被赋值,store 把工作内存的变量传递给主内存 write 真正的放到主内存中。

    read   变量由主内存读到工作内存里 load  加载 这个变量, use 使用这个变量。

    8个操作8个纪律

    重点 volatile 

    这个关键字可以干什么?

    1 改变变量可见性,我们知道,普通变量的值修改后,需要传递给主内存,然后其他线程才能够看到。但是,改变可见性后,该变量的值对所有线程可见,更改后可以立刻被其他线程看到。

    为什么?

    因为 它的编译结果相对普通变量多了lock addl $0x0,(%esp),这句指令相当于 执行了一次 store 和write的操作,把内存从工作内存 放到了主内存。

    但是根据1 我们是不是可以说,volatitle 变量修饰的运算    在并发下是安全的。答案是不全对的。

    为何?

    z

    还有一个 是禁止指令重排序。

    个人觉得,指令重排序的作用就是保护 不同cpu访问同一个内存时,数据同步。具体表现是lock addl $0x0,(%esp) 这个操作相当于一个内存屏障,指令重排序时不能将指令放到屏障之前。

    相关文章

      网友评论

          本文标题:【笔记】深入---java内存模型与线程

          本文链接:https://www.haomeiwen.com/subject/ojsczxtx.html