AtomicInteger小小的理解

这里仅仅是验证多线程环境下,AtomicInteger的安全性。

通过源码不难发现两点:

1、value属性是volatile修饰

2、使用了unsafe的CAS操作

通过上述两点,实现非阻塞同步(乐观锁),实现线程安全。

/**
* 验证在并发情况下,AtomicInteger的线程安全性
* AtomicInteger并不是通过互斥同步(Syncronized)实现的
* 其value属性用volatile修饰,保证其可见性(对对象的修改,对其他线程立即可见)
* 同时,通过 CAS(compare and swap)这一原子操作,保证其多线程安全
*
* Atomically increments by one the current value.
* public final int incrementAndGet() {
    for (;;) {
      int current = get(); // 获取volatile value最新值
      int next = current + 1; // 期望值,也就是本次执行后的值,这里是自增1
      if (compareAndSet(current, next)) // 使用CAS这一原子操作比较current,如果相同,则将next这个新值设置进去;如果current发生变化,则继续循环取值-CAS操作
      return next;
    }
  }
*
* @author zhuotao
*
*/
public class AtomicIntegerTest {

  private static AtomicInteger atomInt = new AtomicInteger();
  private static final int THREAD_COUNT = 20;

  public static void main(String[] args) {

    Thread[] threads = new Thread[THREAD_COUNT];
    for(int i = 0; i < THREAD_COUNT; i++) {
      threads[i] = new Thread(new Runnable() {
        @Override
        public void run() {
          for(int j = 0; j < 1000; j++) {
            atomInt.incrementAndGet();
          }
        }

      });
      threads[i].start();
    }

    while(Thread.activeCount() > 1) Thread.yield();  // 如果在当前thread group中仍然存在活跃线程,执行yield操作,通知调度器放弃当前使用的procesor
    System.out.println(atomInt.get());

  }

}

时间: 2024-10-07 01:23:09

AtomicInteger小小的理解的相关文章

AngularJS』一点小小的理解

『AngularJS』一点小小的理解 AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发框架不断的提出与发展,而就目前来说,除了游戏.IM(类似QQ).Office这类软件之外,新出的软件应用开始出现两个方向,一个是以Web为主的Web APP,一个是以移动端为主的移动APP.且,现有也有一种声音认为Web APP早晚会取代移动端原生APP,从而一统计算机软件的应用方式.暂且不论这种说

关于VUe的生命周期小小的理解

实例化初始化->beforeCreate()->数据监测->事件配置->实例已经创建完成(created),在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调.然而,挂载阶段还没开始,$el 属性目前不可见.->el属性是否可见->template模板是否可见->解析模板到渲染函数->beforeMount(在挂载开始之前被调用,相关的render函数首次被调用)->创建挂载-&

栈和堆的理解

下面是本人对栈和堆的一点小小的理解... 值类型: Short   int  long Float Double Boolean Char Byte 下面是一些图片的解析 1.封装 .封装又称信息隐藏,是指利用抽象数据类型(自定义类)将数据和数据的操作结合在一起,使其构成一个不可分割的独立实体,尽可能的隐藏内部的细节,只保留一些对外接口,使之于外部发生联系. 封装的优点 第一:重用; 第二:不必关心具体的实现; (方法) 第三:面向对象三大特征之一; 第四,具有安全性! 小孩儿 老舍37<四世同

你是怎么理解“MVC”的

MVC就是三个字母的组合,M-模型, V-视图, C-控制器. 这些在百度上随便一索就可以索到,而且网上对这三个部分的解释又过于笼统,使人没法完全理解MVC的含义. 这里我简单的谈谈我对MVC这三个部分的一个理解并说明它们的具体职责是什么.我以网页脚本PHP为例. 我们知道在网站的访问过程中在浏览器和web服务器之间传输的最多的就是数据,所以我认为MVC这三个部分就是为了数据的产生,传输,和显示和产生的. M-模型负责了数据的产生和处理.它可以自己产生数据,它也可以从其它的存储介质如文件.数据库

嵌入式Linux框架的理解

从事嵌入式linux工作也几年了,如果算上大学期间的自学,那么也算是个工程师了.期间写过底层bootloader.内核的驱动和上层应用程序.对于芯片内部的模块也在大学时候用fpga的verilog玩过,所以对于整个嵌入式的框架也算是有点小小的理解,今天我们一起来来谈谈.如有偏差,请各位不吝赐教! 首先还是看下整个框架. 关于bootloader 1.当板子一上电,因为芯片有boot的功能,自动会从flash搬启动代码并执行处理.这里的代码其实就是bootloader的第一个阶段.其实bootlo

把时间当做朋友(李笑来)Chapter 1 【心智的力量】 摘录

今天开了读书笔记这一专题,主要是对自己今后读的书有一个小小的记录,也为解决自己读书多年的存在的一些习惯的问题. 打小就喜欢书,可能最早的书是家人买的看图识动物.还记得七八岁时见书摊上的书时赖着不走央求母亲给买的情景,那时买的童话居多,记得还有一本长篇的童话,故事也不是王子公主之类的短篇幅,而是逻辑更复杂,篇幅更长的故事类,一本里就几篇,那时这本童话书让我小小的理解能力和见识得到了很大锻炼, 小学图书主要靠相互借阅,期间林林总总的读了很多中外名著,在背东西上更是感觉毫无压力,记得自己四年级时完全靠

对JavaScript中异步同步机制以及线程深入底层了解

今天在网上看到各种对Js异步同步单线程多线程的讨论 经过前辈们的洗礼 加上鄙人小小的理解 就来纸上谈兵一下吧~ Js本身就是单线程的 至于为什么Js是单线程的 那就要追溯到Js的历史了 总而言之 由于Js是浏览器的脚本语言 经常操作dom元素 多线程的话反而会导致更复杂(删除与添加同时进行?)这只是简单的解释了为什么Js要单线程的原因, 为什么Js又能异步执行方法呢? 这特么的不是很矛盾吗!!! 但是,但是注意了 就是因为Js主要是在浏览器中运行的脚本语言 浏览器是典型的GUi工作线程 因为它在

Effective Java之泛型

泛型是Java在JDK1.5版本中引入的一个特性,泛型的出现大大增强了Java代码运行时的安全性,泛型主要应用于容器类中,因为这些类会包含各种各样的其他类,所以需要用泛型来对容器中所包含的类进行约束,比如为List传入一个String的类型参数,那么,这个List对象就只能包含有String类型的类,而不能向1.5之前的原始版本一样,可以包含各种不同的类,泛型的引入大大增强了集合类的约束,减少在使用集合类时报类型转换错误的概率. 书里面建议,在使用数组时尽量采用泛型容器,而不是基本的数组类型,里

Java之旅EJB(3)——Ant提高ejb开发效率

前面已经讲过了并且已经演示过了,我们部署一个程序的过程是很繁琐的,不仅仅要手动拷贝生成的jar包,还有将在之前进行jar的生成,好麻烦啊,那么接下来就介绍一个新的小伙伴来帮你一把吧. Myeclipse或者说是eclipse是集成了ant工具的, 1.      简介 关于Ant的简介,这是网上的资料,Ant是一种基于Java的build工具.理论上来说,它有些类似于(Unix)C中的make ,但没有make的缺陷.目前的最新版本为:Ant1.9.4[1]  . 既然我们已经有了make,gn