Java多线程--原子操作

循环CAS实现原子操作

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<>(600);
        long start = System.currentTimeMillis();
        for (int j = 0; j < 100; j++) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        cas.count();
                        cas.safeCount();
                    }
                }
            });
            ts.add(thread);
        }

        // 启动所有线程
        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 = this.atomicI.get();
            boolean suc = this.atomicI.compareAndSet(i, ++i);
            if (suc) {
                break;
            }
        }
    }

    /**
     * 非安全计数器
     */
    private void count() {
        this.i++;
    }
}

执行结果:
这里写图片描述
摘自《Java多线程并发编程艺术》

猜你喜欢

转载自blog.csdn.net/BtWangZhi/article/details/82155631