计数 i++,++i 简单的线程安全与线程非安全的代码对比

来源:互联网 发布:虫虫群发软件 编辑:程序博客网 时间:2024/06/10 00:08
执行代码就可以看出来 i++,++i并非线程安全的import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;public class Counter {    private AtomicInteger atomicI = new AtomicInteger(0);    private int i = 0;    public static void main(String[] args) {        final Counter cas = new Counter();        List<Thread> ts = new ArrayList<Thread>(600);        long start = System.currentTimeMillis();        for (int j = 0; j < 100; j++) {            Thread t = new Thread(new Runnable() {                public void run() {                    for (int i = 0; i < 10000; i++) {                        cas.count();                        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.i);        System.out.println(cas.atomicI.get());        System.out.println(System.currentTimeMillis() - start);    }    /** * 使用CAS实现线程安全计数器 */    private void safeCount() {        for (;;) {            int i = atomicI.get();            boolean suc = atomicI.compareAndSet(i, ++i);            if (suc) {                break;            }        }    }    /**     * 非线程安全计数器     */    private void count() {        i++;    }}


0 0
原创粉丝点击