JVM处理并发具有原子性可见性有序性
1、原子性(Atomictity)
基本数据类型访问读写都是原子性
如果需要更大范围的原子性保证 Java内存模型提供了lock unlock 操作满足这种需求
synchronized关键字 synchronized也具备原子性
2、可见性
可见性就是指当一个线程修改了共享变量时 其他线程 能够立即得知这个线程修改
Java内存模型通过在改变量修改将新值同步回主内存,在读取前从内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性
无论是普通变量还是volatile变量都是如此 普通变量与volatile变量的区别时 volatitle的特殊规则保证了心智立即同步到主内存 以及每次使用前立即从主内存中刷新 因此volatile保证了多线程操作变量的可见性
Java还有两个关键字实现可见性 一个时synchronized和final 一个是final
synchronized同步块可见性 :
必须先把此变量同步回主内存内(Store、write操作)
final可见性是指:
被final修饰的关键字段在构造器中一旦被初始化完成 并且构造器没有把this的引用传递出去那么其他线程能看见final字段
this引用逃逸是件很危险的事情 其他线程有可能通过这个引用访问初始化了一半的对象
有序性
Java内存模型有序性在前面讲解 java中有序性:
在本线程内观察都是有序的 ,如果在一个线程观察观察另一个线程都是无序的
前半句表现为串行的语义
后半句表现 指令重排序现象和工作内存与主内存延迟现象
Java语言提供了volatile和synchronized关键字来保证线程之间操作的有序性
volatiitle 关键字本身就包含了禁止指令重排序的的语义 而synchronized 是由一个变量在同一个时刻只允许一个线程对他进行lock操作 这个规则决定了持有同一个锁的两个同步块只能串行进入