基于CAS线程安全的计算方法 java并发编程的艺术上的一个案例
package thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * @author changxiangxiang * @date 2014年8月6日 下午3:25:12 * @description * @since sprint2 */ public class Counter { private AtomicInteger atomicI = new AtomicInteger(); public int i = 0; public static void main(String[] args) { final Counter counter = new Counter(); List<Thread> ts = new ArrayList<Thread>(); long start = System.currentTimeMillis(); for (int j = 0; j < 100; j++) { Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { counter.count(); counter.sateCount(); } } }); ts.add(t); } for (Thread tr : ts) { tr.start(); } // 等待所有线程执行完成 for (Thread tr : ts) { try { tr.join(); } catch (Exception e) { e.printStackTrace(); } } System.out.println(counter.i); System.out.println(counter.atomicI.get()); System.out.println(System.currentTimeMillis() - start); } private void sateCount() { // atomicI.getAndIncrement(); // 自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。 for (;;) { int i = atomicI.get(); boolean suc = atomicI.compareAndSet(i, ++i); if (suc) { break; } } } private void count() { i++; } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。