线程安全的atomic wrapper classes例子

Posted 何事西风悲画扇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全的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

以上是关于线程安全的atomic wrapper classes例子的主要内容,如果未能解决你的问题,请参考以下文章

使用atomic一定是线程安全的吗?

C++ 11 可以在不同线程中通过引用安全地传递和访问 std::atomics

Java ArrayList / String / atomic 变量读取线程安全吗?

并发之atomic原子操作

多线程之Atomic包

Java多线程 —— 线程并发库之Atomic