在多线程环境下,如果某个类是有状态的,那我们在使用前,需要保证所有该类的实例对象状态一致,否则会出现意向不到的bug。下面是通用线程安全状态机的实现方法。

public class ThreadSaveState{private int x;private int y; private enum State {NEW, INITIALIZING, INITIALIZED}; private final AtomicReference<State> init = new AtomicReference<State>(State.NEW); public ThreadSaveState() { }; public ThreadSaveState(int x, int y) { initialize(x, y); } private void initialize(int x, int y) { if (!init.compareAndSet(State.NEW, State.INITIALIZING)) { throw new IllegalStateException("Already initialized"); } this.x = x; this.y = y; //… Do anything else the original constructor did init.set(State.INITIALIZED); } //所有公共接口,都要先调用该方法检测对象完整性 private void checkInit() { if (init.get() != State.INITIALIZED) { throw new IllegalStateException("Uninitialized"); } } //示例公用接口 public int getX() { checkInit(); return x; } //示例公用接口 public int getY() { checkInit(); return y; } }

这种模式利用compareAndSet方法来操作枚举的原子引用,关于compareAndSet方法,其内部是CAS算法,即:Compare and Swap, 翻译成比较并交换,源码如下:

java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁,使用这些类在多核CPU的机器上会有比较好的性能.

结合compareAndSet源码我们看下:

/*** Atomically sets the value to the given updated value* if the current value {@code ==} the expected value.* @param expect the expected value* @param update the new value* @return true if successful. False return indicates that* the actual value was not equal to the expected value.*/public final boolean compareAndSet(V expect, V update) { return unsafe.compareAndSwapObject(this, valueOffset, expect, update); }

根据注释,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,返回True,否则返回false。

再看看我们初始化的代码:

 if (!init.compareAndSet(State.NEW, State.INITIALIZING)) {throw new IllegalStateException("Already initialized");}

只有当state是New的时候,才开始初始化,否则直接报错。这就保证了对象的完整性,因为如果没有这样的防范机制,万一有个线程要在某个实例上调用initialize(),而另一个线程又要企图使用这个实例,第二个线程就有可能看到这个实例处于不一致的状态。

转载:http://blog.csdn.net/qq_27258799

转载于:https://www.cnblogs.com/toosuo/p/7642640.html

(转)利用CAS算法实现通用线程安全状态机相关推荐

  1. 24.多线程(等待唤醒机制,volatile,CAS 算法,线程池,定时器,设计模式)

    1.线程间的等待唤醒机制 Object 类中   void wait ()  在其他线程调用此对象的 notify () 方法或 notifyAll () 方法前,导致当前线程等待.         ...

  2. Java多线程学习二十六:原子类是如何利用 CAS 保证线程安全的?

    什么是原子类,以及它有什么作用. 在编程领域里,原子性意味着"一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分".而 java.util.concurrent.a ...

  3. 并发策略-CAS算法

    对于并发控制而言,我们平时用的锁(synchronized,Lock)是一种悲观的策略.它总是假设每一次临界区操作会产生冲突,因此,必须对每次操作都小心翼翼.如果多个线程同时访问临界区资源,就宁可牺牲 ...

  4. 计算机绘出一条虚线算法步骤,国外利用计算机算法将有色线编织成经典绘画

    原标题:国外利用计算机算法将有色线编织成经典绘画 位于莫斯科的程序员Ani Abakumova使用算法将有色线程的长度组织成经典绘画风格.虽然每个线程的放置数学公式都是在她的计算机上创建的,但Abak ...

  5. 通用线程: 学习 Linux LVM

    为什么80%的码农都做不了架构师?>>>    通用线程: 学习 Linux LVM "逻辑卷管理"为存储器管理带来的魔力 Daniel Robbins ( dr ...

  6. Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型

    Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型 原文:https://blog.csdn.net/u011808673/article/details/8079 ...

  7. java cas原理_Java并发之原子变量及CAS算法-上篇

    Java并发之原子变量及CAS算法-上篇 编辑 ​ 概述 本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中是怎么保证变量原子性的呢?.对应Java中的包是:java.uti ...

  8. 通用线程:POSIX 线程详解,第 2部分——称作互斥对象的小玩意

    通用线程:POSIX 线程详解,第 2部分--称作互斥对象的小玩意 Daniel Robbins (drobbins@gentoo.org), 总裁/CEO, Gentoo Technologies, ...

  9. 深入理解CAS算法原理

    转载自 深入理解CAS算法原理 1.什么是CAS? CAS:Compare and Swap,即比较再交换. jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法 ...

最新文章

  1. 这文字的起始位置_ae制作文字动画?ae文字动画教程
  2. java 网站开发实例_完整的javaweb项目
  3. 2015计算机类专业课类试卷,2015年自考《计算机应用基础》模拟试题及答案
  4. 无头结点的单链表删除一个中间结点
  5. 删除linux分区后grub,删除Ubuntu分区后GRUB救援问题!
  6. 小说站源码php采集,关于PHP批量采集----采集小说站有感
  7. 使用 TICS Pro 配置时钟芯片
  8. 牛客面试必刷101代码总结【python】
  9. 安装uTool之后鼠标中键异常被uTool接管
  10. 模拟人生3显示服务器,模拟人生3服务器初始化失败
  11. 基于优化LSTM 模型的股票预测
  12. 前端处理 token 时效性问题
  13. android打开cad卡顿,两万高配置电脑使用CAD非常卡顿怎么办
  14. 【搬运】常用逻辑符号整理
  15. 1万人游戏服务器多少钱?
  16. pow函数与快速幂(优化)(O(logn)的复杂度)
  17. 望月新一IUT理论的科普视频:abc Conjecture and New Mathematics
  18. 基于RGB和LiDAR融合的自动驾驶3D语义分割
  19. Linux Shell 通配符、元字符、转义符使用实例介绍--Learning the korn shell
  20. Shopee Man:泰国虾皮市场分析,本土商家选择泰国站的优势有哪些?

热门文章

  1. 计算代码重复率_了解了知网大学生论文查重原理,重复率想高于6%都难!
  2. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫
  3. JZOJ 100046. 【NOIP2017提高A组模拟7.14】收集卡片
  4. oracle11g ora 12545,sqlplus本地登录报错ORA-12545
  5. 每个java 初学者都应该明白的
  6. ICCV 2019 《Robust Change Captioning》论文笔记(数据集)
  7. 运输pascal 90分程序
  8. python输出数字和字符串_(一)1-5Python数字和字符串
  9. 一般将来时语法课教案_【语法视频课】第43~45节(虚拟语气)
  10. r语言和metawin_如何创建R的HelloWorld包(Windows或Linux环境下)