• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
风吹花落泪如雨
博客园    首页    新随笔    联系   管理    订阅  订阅

java并发编程(三)并发模拟工具和线程安全性

AtomicXXX类:

incrementAndGet方法:

unsafe类方法:

示例:2+1=3

var1是当前对象(count),var2是当前count的值(2),var4=1,

var6是底层的值,若无其他线程干扰,var6应该是2。

这句话的含义:对于var(count)对象,若当前值var2和底层值var6相同的话,将var6更新成var6+var4(1);

若当前值和底层的值不相同,则重新从底层获取值,并且当前count对象会指向新的值(3),一直循环,直到底层的值和当前对象的值相同

 cas是java底层的方法

 

 ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------

 AtomicLong和LongAdder的区别

引用:https://blog.csdn.net/yao123long/article/details/63683991

  LongAdder在AtomicLong的基础上将单点的更新压力分散到各个节点,在低并发的时候通过对base的直接更新可以很好的保障和AtomicLong的性能基本保持一致,而在高并发的时候通过分散提高了性能。
  缺点是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差。

---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------

AtomicReference类

AtomicIntegerFieldUpdater类

---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------

AtomicStampReference解决CAS的ABA问题

CAS ABA 问题 :在CAS操作的时候其他线程将变量的值A改成了B又改回了A,本线程用期望值A比较时发现值没有变,于是CAS就将A值进行了交换操作,这值已经被其他线程改变过,与设计思想是不符合的。

解决思路:每次变量更新的时候,把变量的版本号加一,A改成了B又改回了A的过程,就是A 版本1 B版本2 A版本3,从而解决ABA问题,

这里多了stamp 版本比较,其他的跟其他Atomic类的compareAndSet 方法类似

 ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------

AtomicLongArray维护的是个数组,我们可以选择性的更新某个索引的值,也是进行原子性操作的,相比AtomicLong,会多个索引值让我们更新,


 ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------

如何让某段代码只执行一次

 

 volatil不适用于计数,因为无法保证原子性

适合作为状态标识:

程序次序规则:仅针对有依赖的代码,无依赖代码可乱序执行

 

posted @ 2018-12-05 01:10  风吹花落泪如雨  阅读(131)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3