zoukankan      html  css  js  c++  java
  • 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());

      }

    }

  • 相关阅读:
    oracle 判断字符串是否包含指定内容
    java 如何使用多线程调用类的静态方法?
    oracle 快速复制表结构、表数据
    oracle 清空表数据的2种方式及速度比较
    一、Instrument之Core Animation工具
    net登录积分(每天登录积分仅仅能加一次) 时间的比較
    正规方程 Normal Equation
    笑谈贝叶斯网络(干货)上
    SQL SERVER 面试题
    好的创始人想要改变世界,最好的创始人还要不放弃——扎克伯格清华中文演讲
  • 原文地址:https://www.cnblogs.com/aking1988/p/4572220.html
Copyright © 2011-2022 走看看