java并发编程(一):计数器

来源:互联网 发布:反淘宝 编辑:程序博客网 时间:2024/05/29 15:16

买了一本《java并发编程的艺术 》,开启学习并发编程之路。 

根据jdk提供的原生的原子变量计数。

package test201603;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;/** * 计数器 */public class Counter {    private AtomicInteger atomicI = new AtomicInteger(0);    public static void main(String[] args) {        final Counter cas = new Counter();        List<Thread> ts = new ArrayList<Thread>(600);        for (int j = 0; j < 100; j++) {            Thread t = new Thread(new Runnable() {                @Override                public void run() {                    for (int i = 0; i < 10000; i++) {                        cas.safeCount();                    }                }            });            ts.add(t);        }        //开启所有线程        for (Thread t : ts) {            t.start();        }        // 等待所有线程执行完成        for (Thread t : ts) {            try {                t.join();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        System.out.println(cas.atomicI.get());    }    /**     * 使用CAS实现线程安全计数器     */    private void safeCount() {        for (;;) {            int i = atomicI.get();            boolean suc = atomicI.compareAndSet(i, ++i);            if (suc) {                break;            }        }    }}


根据上面的代码,其中compareAndSet方法是关键,safeCount方法里面有一个死循环,首先获得当前值i,然后当前值加1作为更新值,如果当前值i没有发生变化则用更新值替换当前值,如果当前值改变了,那么就继续循环下去。

0 0