在变成过程中我们需要保证变量的线程安全,在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 iT2 load iT1 store i+1T2 store i+1

这里应该执行两次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靠谱

转载于:https://www.cnblogs.com/weiguo21/p/4815962.html

java多线程详解(8)-volatile,Atomic比较相关推荐

  1. Java多线程详解(线程不安全案例)

    嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1.  Java多线程详解(基本概念)​​​​​​​ 2. Java多线程详解(如何创建线程) ...

  2. Java多线程详解(基本概念)

    嗨喽-小伙伴们我来啦, 从本章开始,我们就要开始介绍Java中一个非常重要的概念-----多线程.线程化思想是计算机领域的重要思想,有了线程,咱编写的程序才能更为高效准确地运行起来. 首先,咱来了解一 ...

  3. Java 多线程详解(五)------线程的声明周期

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...

  4. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...

  5. Java 多线程详解(三)------线程的同步

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...

  6. Java 多线程详解(二)------如何创建进程和线程

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 在上一篇博客中,我们已经 ...

  7. 【运维能力提升计划-3】Java多线程详解

    Java多线程详解 学习链接 Java.Thread 线程简介 线程 进程 多线程 线程实现 Thread 继承Thread类 调用run方法只有主线程一个线程,调用start方法生成子线程与主线程并 ...

  8. Java多线程详解(二)

    评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡 ...

  9. Java 多线程详解(一)------概念的引入

    这是讲解 Java 多线程的第一章,我们在进入讲解之前,需要对以下几个概念有所了解. 1.并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在 ...

最新文章

  1. php 输出函数结果,PHP向浏览器输出内容的4个函数总结
  2. C++基础知识(二)--左值右值--逻辑表达式求值优化--逗号运算符与表示式--输入输出格式控制...
  3. 吃大小写的亏,上符号的当
  4. 【MySQL】MySQL监控工具 mysql-monitor
  5. 加密货币交易所Coinbase在私募股票市场中估值达900亿美元
  6. 卷积神经网络——第一周 卷积神经网络基础——第一部分
  7. delphi 获取数组长度_Java中的数组(基础篇六)
  8. 安装sphinx的心得和错误处理
  9. 动画图解:十大经典排序算法动画与解析,看我就够了!(配代码完全版)
  10. 中国伺服电机市场现状调查与投资战略分析报告2022-2028年
  11. spssfisher判别分析步骤_在SPSS中进行Fisher判别分析的具体操作及研究意义——【杏花开医学统计】...
  12. 逻辑删除数据库中的数据。
  13. git pull --rebase的作用是什么,它与git pull有什么区别?
  14. 为什么rar密码不能被破解
  15. java se1.6配套Jdk,javase 1.6与jdk1.6
  16. 观点 | 银行业数据应用的瓶颈与打开思路
  17. 13、hive在启动beeline客户端时报错:User: xxx is not allowed to impersonate xxx
  18. Git提交代码到新仓库(--mirror)
  19. 网络猫只有计算机和机顶盒两个口,光猫绑定VLAN解决网络和IPTV共用一根网线的问题...
  20. python:lzma --- 用 LZMA 算法压缩

热门文章

  1. 表单提交数据大小的限制
  2. Windows Forms 实现安全的多线程详解
  3. 金九银十,九月已过。Vue这些知识你还不懂?(面试篇1.5W字)
  4. 最大化最小值 | | 最小化最大值
  5. CC3200底板测试-烧写CC3200-LAUNCHXL
  6. OpenStack 集群部署工具:ProStack
  7. NSString的几种常用方法
  8. Grunt-Kmc基于KISSY项目打包
  9. Asp.net(C#)中备份还原SQL Server数据库实现
  10. Python爬虫_数据存储