volatile synchronized AtomicInteger的区别
在网络上看了很多关于他们两个的区别与联系,今天用自己的话表述一下:
synchronized
容易理解,给一个方法或者代码的一个区块加锁,那么需要注意的是,加锁的标志位默认是this对象,当然聪明的你可能想我能不能不用this对象而使用其他的哪?答案是肯定的
volatile
说volatile就不得不说JAVA的内存模型,java的每一个线程都有自己的指定的内存区域,而且又有共同的主内存区域,当操作计算的时候,会从主内存区域将变量拷贝到自己的内存区域,再计算,计算之后再写回去,那么问题就来了,当一个线程A把共享变量读入自己的区域,计算的时候,线程B也把共享变量读入自己的内存区域进行计算,这样就可能产生脏数据,然而咱们的volatile就是解决了这个问题,A修改了共享变量,B线程立刻就能知道,并且也跟着修改(怎么实现的我也不知道,反正加了这个关键字就行)
AtomicInteger
AtomicInteger 通俗地解释:对某个内存值拷贝一个副本,某个线程若读到该副本,并对其进行计算,输出结果,在写入内存时,再次取出内存值和该副本比较,若副本和内存值相同,则把新的值写入内存。较为官方的解释: 通过CAS(AtomicInteger)实现,CAS简而言之就是。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。两个问题:
(1)CAS算法仍然可能会出现冲突,例如A、B两个线程,A已经进入写内存但未完成,此时A读取到的副本且读取成功,AB两个线程同时进入写内存操作,必然会造成冲突。 CAS算法本质并非完全无锁,而是把获得锁和释放锁推迟至CPU原语实现,相当于尽可能的缩小了锁的范围;直接互斥地实现系统状态的改变,它的使用基本思想是copy-on-write——在修改完对象的副本之后再用CAS操作将副本替换为正本。
(2)ABA问题,若其中一个线程修改A->B->A,另外一个线程仍然读取到A,虽然值是预期值,但并不能说明该内存值没有变化。
volatile synchronized AtomicInteger的区别的更多相关文章
- volatile和synchronized到底啥区别?多图文讲解告诉你
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- 如何使用 volatile, synchronized, final 进行线程间通信
原文地址:https://segmentfault.com/a/1190000004487149.感谢作者的无私分享. 你是否真正理解并会用volatile, synchronized, final进 ...
- Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)
这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的 ...
- 加不加 synchronized 有什么区别?
今天一起来认识认识 synchronized 这个一面试就会被提到的关键字.这一篇不会讲太多理论,主要先熟悉熟悉一下最简单的用法.只讨论一个问题:方法没用 synchronized 和用了 synch ...
- volatile与synchronized有什么区别?
下列说法正确的是()? A.我们直接调用Thread对象的run方法会报异常,所以我们应该使用start方法来开启一个线程 B.一个进程是一个独立的运行环境,可以被看做一个程序或者一个应用.而线程是在 ...
- Java 关键字volatile 与 synchronized 作用与区别
1,volatile 它所修饰的变量不保留拷贝,直接访问主内存中的. 在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器).为了性能,一个线程会在自己 ...
- Java自增原子性问题(测试Volatile、AtomicInteger)
这是美团一面面试官的一个问题,后来发现这是一道面试常见题,怪自己没有准备充分:i++;在多线程环境下是否存在问题?当时回答存在,接着问,那怎么解决?...好吧,我说加锁或者synchronized同步 ...
- Java多线程之原子性 volatile、atomicInteger测试
原文链接:http://www.cnblogs.com/zhengbin/p/5653051.html 一.补充概念 1.什么是线程安全性? <Java Concurrency in Pract ...
- 多线程之wait,notify,volatile,synchronized,sleep
最近在学习多线程,现在进行总结一下吧.首先要了解一下以下几个名词. (1)wait:当线程调用wait()方法时,当前该线程会进入阻塞状态,且释放锁,使用wait方法的时候,必须配合synchroni ...
随机推荐
- 解决ADB server didn't ACK问题
ADB server didn't ACK | 浏览:7400 | 更新:2013-08-11 21:19 1 2 3 4 5 6 7 分步阅读 当我们通过eclipse开发Android应用时,会连 ...
- java反射遍历实体类属性和类型,并赋值和获取值
/* * GetModelNameAndType.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ packag ...
- 老美的zxing和日本的qrcode哪个好?
ZXing用Java实现的多种格式的1D/2D条码图像处理库,Zxing库的主要部分支持以下几个功能:核心代码的使用.适用于J2SE客户端的版本.适用于Android客户端的版本(即BarcodeSc ...
- Swift - EasingAnimation绘制圆环动画
Swift - EasingAnimation绘制圆环动画 效果 源码 https://github.com/YouXianMing/Swift-Animations // // CircleView ...
- PL/SQL 存储过程
PL/SQL复习九 存储过程 无参数的存储过程: create or replace procedure out_time is begin dbms_output.put_line(to_char( ...
- 毒枭第一季/全集Narcos迅雷下载
英文全名Narcos,第1季(2015)Netflix.本季看点:<缉毒特警>该剧再现了上世纪八十年代末期警方与臭名昭著的大毒枭激烈交战的真实故事.律师.法官.政客.警察.军队甚至平民全都 ...
- Lua date format
网上有比较复杂的方法:Date Formatting Functions 写了一个非常简单的代码 1: function formatDate(seconds, dateformat) 2: -- ...
- [Android] Implementation vs API dependency
原文链接: https://jeroenmols.com/blog/2017/06/14/androidstudio3/ https://blog.csdn.net/lonewolf521125/ar ...
- [Web 前端] superagent-nodejs处理请求的模块
cp from : https://blog.csdn.net/xiao_chun5316/article/details/48164435 关于superagent,这次写react组件,发送请求都 ...
- go语言之进阶篇定时器Timer的使用
1.Timer的使用 示例: #创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间) package main import ( "fmt" "tim ...