AtomicInteger解决线程同步的问题

内容转载自csdn用户:zz198808java

J2SE 5.0提供了一组atomic class来帮助咱们简化同步处理。基本工做原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增、减、赋值(更新)操做. 好比对于++运算符AtomicInteger能够将它持有的integer 可以atomic 地递增。在须要访问两个或两个以上 atomic变量的程序代码(或者是对单一的atomic变量执行两个或两个以上的操做)一般都须要被synchronize以便二者的操做可以被看成是一个atomic的单元。

web

java多线程用法-使用AtomicInteger安全

下面经过简单的两个例子的对比来看一下 AtomicInteger 的强大的功能多线程

class Counter {并发

private volatile int count = 0;高并发


public synchronized void increment() {atom

count++;  //若要线程安全执行执行count++,须要加锁spa

}.net


public int getCount() {线程

return count;

}

}


class Counter {

private AtomicInteger count = new AtomicInteger(); 


public void increment() {

count.incrementAndGet();

}

       //使用AtomicInteger以后,不须要加锁,也能够实现线程安全。

public int getCount() {

return count.get();

}

}


从上面的例子中咱们能够看出:使用AtomicInteger是很是的安全的

那么为何不使用记数器自加呢,例如count++这样的,由于这种计数是线程不安全的,高并发访问时统计会有误,而AtomicInteger为何可以达到多而不乱,处理高并发应付自如呢?

这是由硬件提供原子操做指令实现的。在非激烈竞争的状况下,开销更小,速度更快。Java.util.concurrent中实现的原子操做类包括:

AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。