这里仅仅是验证多线程环境下,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());

  }

}

AtomicInteger小小的理解的更多相关文章

  1. AngularJS』一点小小的理解

    『AngularJS』一点小小的理解   AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与 ...

  2. 『AngularJS』一点小小的理解

    AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发框架不断的提出与发展,而就目前来说,除 ...

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

    实例化初始化->beforeCreate()->数据监测->事件配置->实例已经创建完成(created),在这一步,实例已完成以下的配置:数据观测(data observer ...

  4. 你是怎么理解“MVC”的

    MVC就是三个字母的组合,M-模型, V-视图, C-控制器. 这些在百度上随便一索就可以索到,而且网上对这三个部分的解释又过于笼统,使人没法完全理解MVC的含义.   这里我简单的谈谈我对MVC这三 ...

  5. 嵌入式Linux框架的理解

    从事嵌入式linux工作也几年了,如果算上大学期间的自学,那么也算是个工程师了.期间写过底层bootloader.内核的驱动和上层应用程序.对于芯片内部的模块也在大学时候用fpga的verilog玩过 ...

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

    今天在网上看到各种对Js异步同步单线程多线程的讨论 经过前辈们的洗礼 加上鄙人小小的理解 就来纸上谈兵一下吧~ Js本身就是单线程的 至于为什么Js是单线程的 那就要追溯到Js的历史了 总而言之 由于 ...

  7. 利用ADSL拨号上网方式如何搭建服务器

    序:搭建服务器需要两个条件硬件服务器和固定公网IP,随便一台个人电脑都可以作为硬件服务器,就剩下一个问题,如何获得一个固定公网IP. 第一章 扫盲:ADSL拨号上网方式,本地IP与公网IP的区别 一. ...

  8. js中的“闭包”

    js中的“闭包” 姓名:闭包 官方概念:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ( ⊙o⊙ )!!!这个也太尼玛官方了撒,作为菜鸟的 ...

  9. IIS8中使用OpenSSL来创建CA并且签发SSL证书

    前言 [转载]http://alvinhu.com/blog/2013/06/12/creating-a-certificate-authority-and-signing-the-ssl-certi ...

随机推荐

  1. Spring的MVC控制器返回ModelMap时,会跳转到什么页面?

    控制器中的方法如下: @RequestMapping("/person/personDisplay") public ModelMap defaultHandler() { Sys ...

  2. JMeter学习资料

    JMeter User Manual: http://jmeter.apache.org/usermanual/index.html JMeter Componet reference: http:/ ...

  3. 深入理解object C中复制对象的用法(一)

    第一.复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象. 第二.如果一个对象想具备复制的功能,必须实现<NSCopying>协议和<NSMutableCopyi ...

  4. linux下的type命令

    type命令用来显示指定命令的类型.一个命令的类型可以是如下几种: alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 builtin 内建命令,She ...

  5. SpringMVC+SwfUpload进行多文件同时上传

    由于最近项目需要做一个多文件同时上传的功能,所以好好的看了一下各种上传工具,感觉uploadify和SwfUpload的功能都比较强大,并且使用起来也很方便.SWFUpload是一个flash和js相 ...

  6. String Format for DateTime [C#]

    This example shows how to format DateTime using String.Format method. All formatting can be done als ...

  7. .NET注册页面代码

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  8. Java基础知识强化25:Java创建对象的四种方式

    1. Java程序中对象的创建有四种方式: ● 调用new语句创建对象,最常见的一种 ● 运用反射手段创建对象,调用java.lang.Class 或者 java.lang.reflect.Const ...

  9. PHP博客小项目之知识点(1)

    一.博客系统介绍 Blog.Bloger.web log(网络日志) 博客主要发布一些文章.图片:博客一般都是个人博客: 博客的文章,一般都是按照时间倒序排列: 博客,仅音译,英文名为Blogger, ...

  10. 06-自定义Attribute标记案例

    自定义Attribute: 1)Attribute都从System. Attribute类继承,类名一般以Attribute结尾 2) 标记类的用途—AttributeUsage标记(标记的标记):A ...