• 线程安全的atomic wrapper classes例子


    先参考一个例子 http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html#!comments

    即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。如果配合Java 5增加的atomic wrapper classes,对它们的increase之类的操作就不需要sychronized。 

    使用AtomicInteger,它封装了一些integer的原子操作,并使之线程安全

    package threadTest;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
    
    
    public class AtomicIntegerTestApp1 {
        public static AtomicInteger count = new AtomicInteger(0);
    
        public static void inc() {
    
    //      count++;
            count.incrementAndGet();
        }
    
        public static void main(String[] args) throws InterruptedException {
    
            ExecutorService service= Executors.newFixedThreadPool(Integer.MAX_VALUE);
    
            for (int i = 0; i < 10000; i++) {
                service.execute(new Runnable() {
                    @Override
                    public void run() {
                        ThreadPoolTestApp1.inc();
                    }
                });
            }
    
            service.shutdown();
            //给予一个关闭时间(timeout),但是实际关闭时间应该会这个小
            service.awaitTermination(300, TimeUnit.SECONDS);
    
            System.out.println("运行结果:Counter.count=" + ThreadPoolTestApp1.count);
        }
    }

     Java中的原子操作包括:
    1)除long和double之外的基本类型的赋值操作
    2)所有引用reference的赋值操作
    3)java.concurrent.Atomic.* 包中所有类的一切操作
    count++不是原子操作,是3个原子操作组合
    1.读取主存中的count值,赋值给一个局部成员变量tmp
    2.tmp+1
    3.将tmp赋值给count

  • 相关阅读:
    [Python]从豆瓣电影批量获取看过这部电影的用户列表
    Matlab插值计算各时刻磁法勘探日变观测值
    [C#]Windows文件分类器小程序
    死磕以太坊源码分析之state
    死磕以太坊源码分析之MPT树-下
    死磕以太坊源码分析之MPT树-上
    死磕以太坊源码分析之txpool
    死磕以太坊源码分析之区块上链入库
    死磕以太坊源码分析之downloader同步
    死磕以太坊源码分析之Ethash共识算法
  • 原文地址:https://www.cnblogs.com/winkey4986/p/5522804.html
Copyright © 2020-2023  润新知