volatile易变的
来源:互联网 发布:围棋 形势判断算法实现 编辑:程序博客网 时间:2024/05/20 01:12
原子性
原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
原子性就像数据库里面的事务一样,他们是一个团队,同生共死。其实理解原子性非常简单,我们看下面一个简单的例子即可:
i =
0
; ---
1
j = i ; ---
2
i++; ---
3
i = j +
1
; ---
4
上面四个操作,有哪个几个是原子操作,那几个不是?如果不是很理解,可能会认为都是原子性操作,其实只有1才是原子操作,其余均不是。
1—在Java中,对基本数据类型的变量和赋值操作都是原子性操作;
2—包含了两个操作:读取i,将i值赋值给j
3—包含了三个操作:读取i值、i + 1 、将+1结果赋值给i;
4—同三一样
在单线程环境下我们可以认为整个步骤都是原子性操作,但是在多线程环境下则不同,Java只保证了基本数据类型的变量和赋值操作才是原子性的(注:在32位的JDK环境下,对64位数据的读取不是原子性操作*,如long、double)。要想在多线程环境下保证原子性,则可以通过锁、synchronized来确保。
volatile是无法保证复合操作的原子性
Java提供了volatile来保证可见性。
当一个变量被volatile修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会立即被更新到主内存中,当其他线程读取共享变量时,它会直接从主内存中读取。当然,synchronize和锁都可以保证可见性
有序性
有序性:即程序执行的顺序按照代码的先后顺序执行。
在Java内存模型中,为了效率是允许编译器和处理器对指令进行重排序,当然重排序它不会影响单线程的运行结果,但是对多线程会有影响。
Java提供volatile来保证一定的有序性。最著名的例子就是单例模式里面的DCL(双重检查锁)。这里LZ就不再阐述了。
===============================>
==========================================>
=====================================================>
再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。
- volatile易变的
- 易变的关键字----volatile
- 使用volatile类型发布不可变对象
- “变还是不变,这是一个问题?”——volatile
- James Bach:易变的测试工程师
- 简单易变的CSS阴影效果
- 型变的理解,逆变与协变
- volatile的含义
- volatile的含义
- volatile的用法
- volatile的作用
- volatile的用法
- volatile的作用
- 发现volatile的使用方法
- volatile的作用
- 对于volatile的理解
- volatile的作用
- volatile的使用
- MapReduce入门之wordcount
- CCF 公共钥匙盒
- Java高级部分知识总结
- task中隐藏不必要日志
- 批量提取文件_excel
- volatile易变的
- 2、算法简介(笔记)
- Spring Data Redis提供的几种序列化的比较
- 2017-11-4离线赛总结(NOIP七连测第二场)
- 【Androrid笔记】android studio签名
- 8 OF 100DAYS
- react学习之路(2.1)----数据传递(state,props(父级向子级传递数据))
- 关于Instruments
- ARC 070