java多线程详解(8)-volatile,Atomic比较
2024-08-22 23:13:32
在变成过程中我们需要保证变量的线程安全,在java中除了使用锁机制或者Threadlocal等保证线程安全,还提供了
java.util.concurrent.atomic.Atomic*(如AtomicInteger,AtomicLong等)原子类和volatile关键字是java中
两种常见的处理多线程下数据共享读写的机制。
二者看似相同,但是在实际应用中有着不小的差别。
1.volatile关键字
volatile关键字是通过本地代码实现的写锁,只保证知有一个线程在写某个数据。JVM为了提高数据存取的速度,
允许每个线程在自己独立的数据块,对进程中共享的数据进行私有拷贝。volatile就是保证每次读数据时,
读的都是存在共享数据块里的数据,而不是私有拷贝。然而,这种机制在有些情况下并不安全。
当两个线程T1,T2同时对volatitle int i;作i++;时,可能出现问题。i++相当于为i=i+1。
T1 load i T2 load i T1 store i+ T2 store i+
这里应该执行两次i=i+1,得到i=i+2的,但是结果确实i=i+1。
因此,这边就有了Atomic原子类存在的价值了。Atomic类被设计来解决这个问题。
2.Atomic* 原子操作
关于atomic*原子操作,这里以AtomicInteger类为例
使用场景:
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,
不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。
/**
* Atomic原子性测试。
*
* @author cary
* @version 1.0.0
*/
public class AtomicTest {
public static void main(String[] args) {
AtomicInteger ai = new AtomicInteger(0);
int i1 = ai.get();
print(i1);
int i2 = ai.getAndSet(5);
print(i2);
int i3 = ai.get();
print(i3);
int i4 = ai.getAndIncrement();
print(i4);
print(ai.get());
} static void print(int i) {
System.out.println("i : " + i);
}
}
结论: atomic比volatile靠谱
最新文章
- Java时间类型转换
- SSH----小小项目的小小总结
- 转帖:Python应用性能分析指南
- codeforces 723F : st-Spanning Tree
- bzoj1535[POI2005]sza-template
- ural 2066. Simple Expression
- WPA-PSK无线网络破解原理及过程(转)
- java7-4 继承的练习
- shorter concat [reverse longer]
- SqlCommand类
- (原创) C# List 找 Max 的 Index
- Windows_server_2012-r2_x64安装教程
- 【linux】linux下vi命令的使用
- day13
- python(random模块)取10以内的随机数
- 使用vue-cli3搭建一个项目
- Python Appium 元素定位方法简单介绍
- java并发基础(一)
- string permutation with upcase and lowcase
- jquery.validate验证表单
热门文章
- 实时监听输入框值变化:oninput &; onpropertychange
- leetcode-【中等题】Divide Two Integers
- 更换win7锁屏壁纸
- maven基本用法
- 阅读{django-restframework}源码[generics.py]学习笔记
- oracle number型日期转date型日期
- shell中的语法(1)
- javascript Windouw 转自 http://www.cnblogs.com/kissdodog/archive/2013/01/01/2841464.html
- Python自动化 【第十八篇】:JavaScript 正则表达式及Django初识
- C# 小例子