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

  }

}

最新文章

  1. 关于springMVC+Mybatis jar包详解
  2. (十二) WebGIS中矢量图层的设计
  3. mysql登录不了及修改密码
  4. Unity3D骨骼动画的分解(CleanData.Ani详解)
  5. SharePoint 2013 配置HTTPS(SSL)
  6. METEOR 及ANGULARJS
  7. centos7 gitlab
  8. Log4j2常见使用示例及Syslog/Syslog-ng
  9. 使用EasyUI要引入哪些文件
  10. open_clientfd(char* hostname,int port)和open_listenfd(int port)
  11. Delphi里的RTTI与反射(举例换掉FOnChange)
  12. mongodb3.2系统性学习——2、write concern mongodb 写安全机制
  13. 4d tensor
  14. shell脚本练习
  15. iOS 之 编外知识点
  16. FT 软件项目管理
  17. 2018年2月19日我的java学习(——)
  18. 017_nginx重定向需求
  19. 开启Apache Server Status
  20. MyEclipse 智能提示设置

热门文章

  1. Number of 1 Bits——LeetCode
  2. g++ gcc 的区别
  3. [Java] TreeMap - 源代码学习笔记
  4. HDU2048(标准错排问题)
  5. ZAB协议(转)
  6. python 2017.1.9
  7. SPOJ PGCD (mobius反演 + 分块)
  8. 【iOS问题记录】关于UITableViewCell的高度、填充
  9. Extjs4学习
  10. Java基础知识强化89:Date类之Data类概述及其方法