下面举的例子,统计了三种同步锁(内部锁、不公平锁、公平锁)并发执行时消耗的时间
?
public interface Counter { public long getValue(); public void increment(); }
?
/** * 内部锁 */ public class SynchronizedBenchmarkDemo implements Counter { private long count = 0; @Override public long getValue() { return count; } @Override public synchronized void increment() { count++; } }?
?
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 不公平锁 */ @SuppressWarnings("all") public class ReentrantLockUnfairBeanchmarkDemo implements Counter { private volatile long count = 0; private Lock lock; public ReentrantLockUnfairBeanchmarkDemo() { // 使用不公平锁 lock = new ReentrantLock(false); } @Override public long getValue() { return count; } @Override public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } }?
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 公平重入锁 */ @SuppressWarnings("all") public class ReentrantLockFairBeanchmarkDemo implements Counter { private volatile long count = 0; private Lock lock; public ReentrantLockFairBeanchmarkDemo() { // 创建公平锁 lock = new ReentrantLock(true); } @Override public long getValue() { return count; } @Override public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } }
?
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * 三种类型的同步锁:内部锁、不公平锁、公平锁,每种类型的锁各自创建2000个线程,然后每个线程访问带有锁得变量100次,并加1。 * 统计各种锁并发访问时消耗的时间 * * @author Administrator * */ @SuppressWarnings("all") public class BenchmarkTest { private Counter counter; // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 private CyclicBarrier barrier; private int threadNum; private int loopNum; private String testName; /******************************************************************* * 用于记录由该对象创建的threadNum线程统开始循环和结束循环的起止时间 */ public long begin; public long end; private BenchmarkTest(Counter counter, int threadNum, int loopNum, String testName) { this.counter = counter; this.threadNum = threadNum; this.loopNum = loopNum; this.testName = testName; barrier = new CyclicBarrier(threadNum, new BarrierTime(this)); } public void test() { try { for (int i = 0; i < threadNum; i++) { new TestThread(counter, loopNum, this).start(); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { try { int threadNum = 2000; int loopNum = 100; new BenchmarkTest(new SynchronizedBenchmarkDemo(), threadNum, loopNum, "内部锁").test(); Thread.sleep(5000); new BenchmarkTest(new ReentrantLockUnfairBeanchmarkDemo(), threadNum, loopNum, "不公平锁").test(); Thread.sleep(5000); new BenchmarkTest(new ReentrantLockFairBeanchmarkDemo(), threadNum, loopNum, "公平锁锁").test(); } catch (InterruptedException e) { e.printStackTrace(); } } class TestThread extends Thread { int loopNum = 100; private Counter counter; private BenchmarkTest benchmarkTest; private TestThread(final Counter counter, int loopNum, BenchmarkTest benchmarkTest) { this.counter = counter; this.loopNum = loopNum; this.benchmarkTest = benchmarkTest; } public void run() { try { // 等待所有线程开始 barrier.await(); for (int i = 0; i < this.loopNum; i++) { counter.increment(); } // 等待所有线程结束 barrier.await(); } catch (Exception e) { throw new RuntimeException(); } } } class BarrierTime implements Runnable { private BenchmarkTest benchmarkTest; public BarrierTime(BenchmarkTest benchmarkTest) { this.benchmarkTest = benchmarkTest; } @Override public void run() { if (benchmarkTest.begin == 0) { benchmarkTest.begin = System.currentTimeMillis(); } else { benchmarkTest.end = System.currentTimeMillis(); } if (benchmarkTest.end != 0) { System.out.println(benchmarkTest.testName + "共花费时间:" + (benchmarkTest.end - benchmarkTest.begin) + "毫秒"); } } } }?