您的位置 首页 > 腾讯云社区

分布使用synchronized关键字和AtomicInteger进行线程同步的例子---Jerry Wang

package atomicIntegerTest; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; public class TestAtomic { public TestAtomic(){ } private static final int MAX_THREADS = 3; private static final int TASK_COUNT = 3; private static final int TARGET_COUNT = 100 * 10000; private AtomicInteger acount = new AtomicInteger(0); private int count = 0; synchronized int inc() { return ++count; } synchronized int getCount() { return count; } class SyncThread implements Runnable { String name; long startTime; TestAtomic out; public SyncThread(TestAtomic o, long startTime) { this.out = o; this.startTime = startTime; } @Override public void run() { int v = out.inc(); // System.out.println("Value after inc: " + v + " Thread id: " + Thread.currentThread().getId()); while (v < TARGET_COUNT) { v = out.inc(); } long endTime = System.currentTimeMillis(); System.out.println("SyncThread spend:" + (endTime - startTime) + "ms" + ", v=" + v + " Thread id: " + Thread.currentThread().getId()); } } class AtomicThread implements Runnable { String name; long startTime; public AtomicThread(long startTime) { this.startTime = startTime; } @Override public void run() { int v = acount.incrementAndGet(); while (v < TARGET_COUNT) { v = acount.incrementAndGet(); } long endTime = System.currentTimeMillis(); System.out.println("AtomicThread spend:" + (endTime - startTime) + "ms" + ", v=" + v + " Thread id: " + Thread.currentThread().getId()); } } @Test public void testSync() throws InterruptedException { ExecutorService exe = Executors.newFixedThreadPool(MAX_THREADS); long startTime = System.currentTimeMillis(); SyncThread sync = new SyncThread(this, startTime); for (int i = 0; i < TASK_COUNT; i++) { exe.submit(sync); } Thread.sleep(1000); } @Test public void testAtomic() throws InterruptedException { ExecutorService exe = Executors.newFixedThreadPool(MAX_THREADS); long startTime = System.currentTimeMillis(); AtomicThread atomic = new AtomicThread(startTime); for (int i = 0; i < TASK_COUNT; i++) { exe.submit(atomic); } Thread.sleep(1000); } }

输出:

SyncThread spend:55ms, v=1000000 Thread id: 16 SyncThread spend:55ms, v=1000002 Thread id: 14 SyncThread spend:55ms, v=1000001 Thread id: 15 AtomicThread spend:37ms, v=1000000 Thread id: 19 AtomicThread spend:37ms, v=1000001 Thread id: 17 AtomicThread spend:37ms, v=1000002 Thread id: 18 ---来自腾讯云社区的---Jerry Wang

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: