测试表明上述对于300个线程,每个线程做10000次加1操作,内置锁syncronized比atomicInteger效率要高
测试代码如下:
public class SyncWithAtomicTest { private int count=0; private static final int threadCount=300; private static final int countNum=10000; private final AtomicInteger countAtomicInteger=new AtomicInteger(0); private static final ExecutorService threadPool=Executors.newFixedThreadPool(threadCount); private final CountDownLatch latchStart=new CountDownLatch(threadCount); private final CountDownLatch latchEnd=new CountDownLatch(threadCount); public synchronized void addWithCountSync(){ for(int i=0;i<countNum;i++){ count++; } } public void addWithAtomicCount(){ for(int i=0;i<countNum;i++){ countAtomicInteger.incrementAndGet(); } } public static void main(String[] args) throws InterruptedException { SyncWithAtomicTest obj=new SyncWithAtomicTest(); Long oldTime=System.currentTimeMillis(); for(int i=0;i<threadCount;i++){ CountTask t=new CountTask(); t.setTarget(obj); threadPool.execute(t); } obj.latchEnd.await(); Long endTime=System.currentTimeMillis()-oldTime; // System.out.println("===============atomic all finish,cost:"+endTime+",the res:"+obj.countAtomicInteger.get()); System.out.println("===============sync all finish,cost:"+endTime+",the res:"+obj.count); } static class CountTask implements Runnable{ private SyncWithAtomicTest target; public void run() { try { target.latchStart.countDown(); target.latchStart.await(); //we do add oper when all threads is ready target.addWithCountSync(); // target.addWithAtomicCount(); System.out.println("thread:"+Thread.currentThread().getId()+",finish the work"); target.latchEnd.countDown(); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } } public void setTarget(SyncWithAtomicTest target) { this.target = target; } } }
原文地址:http://blog.csdn.net/zhaozhenzuo/article/details/36622351