java锁实现_Java锁实现
生活随笔
收集整理的這篇文章主要介紹了
java锁实现_Java锁实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
java鎖實現
我們都將第三方庫用作開發的正常部分。 通常,我們無法控制其內部。 JDK隨附的庫是一個典型示例。 這些庫中的許多庫都使用鎖來管理爭用。 JDK鎖具有兩種實現。 一個使用原子CAS樣式指令來管理索賠過程。 CAS指令往往是最昂貴的CPU指令類型,并且在x86上具有內存排序語義。 鎖通常是無競爭的,這會導致可能的優化,從而可以使用避免使用原子指令的技術將鎖偏向無競爭的線程。 這種偏向使得理論上的鎖定可以被同一線程快速重新獲得。 如果該鎖最終被多個線程爭用,則該算法將從被偏向的狀態恢復,并使用原子指令退回到標準方法。 偏向鎖定已成為Java 6的默認鎖定實現 。 在遵守單一作者原則時,偏向鎖定應該是您的朋友。 最近,當使用套接字API時,我決定測量鎖定成本,并對結果感到驚訝。 我發現我的無競爭線程所產生的開銷比鎖期望的要多。 我匯總了以下測試,以比較Java 6中當前可用的鎖實現的成本。 考試 為了進行測試,我將在鎖中增加一個計數器,并增加鎖中競爭線程的數量。 對于Java可用的3種主要鎖實現,將重復此測試:代碼
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.CyclicBarrier;import static java.lang.System.out;public final class TestLocks implements Runnable {public enum LockType { JVM, JUC }public static LockType lockType;public static final long ITERATIONS = 500L * 1000L *1000L;public static long counter = 0L;public static final Object jvmLock = new Object();public static final Lock jucLock = new ReentrantLock();private static int numThreads;private static CyclicBarrier barrier;public static void main(final String[] args) throws Exception{lockType = LockType.valueOf(args[0]);numThreads = Integer.parseInt(args[1]);runTest(numThreads); // warm upcounter = 0L;final long start = System.nanoTime();runTest(numThreads);final long duration = System.nanoTime() - start;out.printf("%d threads, duration %,d (ns)\n", numThreads, duration);out.printf("%,d ns/op\n", duration / ITERATIONS);out.printf("%,d ops/s\n", (ITERATIONS * 1000000000L) / duration);out.println("counter = " + counter);}private static void runTest(final int numThreads) throws Exception{barrier = new CyclicBarrier(numThreads);Thread[] threads = new Thread[numThreads];for (int i = 0; i < threads.length; i++){threads[i] = new Thread(new TestLocks());}for (Thread t : threads){t.start();}for (Thread t : threads){t.join();}}public void run(){try{barrier.await();}catch (Exception e){// don't care}switch (lockType){case JVM: jvmLockInc(); break;case JUC: jucLockInc(); break;}}private void jvmLockInc(){long count = ITERATIONS / numThreads;while (0 != count--){synchronized (jvmLock){++counter;}}}private void jucLockInc(){long count = ITERATIONS / numThreads;while (0 != count--){jucLock.lock();try{++counter;}finally{jucLock.unlock();}}} }編寫測試腳本:
設置-x
對于{1..8}中的i; 做Java -XX:-UseBiasedLocking TestLocks JVM $ i; 做完了
對于{1..8}中的i; 做Java -XX:+ UseBiasedLocking TestLocks JVM $ i; 做完了 對于{1..8}中的i; 做Java TestLocks JUC $ i; 做完了
結果
| 圖1 |
| 圖2 |
| 圖3 |
觀察結果
翻譯自: https://www.javacodegeeks.com/2012/07/java-lock-implementations.html
java鎖實現
總結
以上是生活随笔為你收集整理的java锁实现_Java锁实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenShift上的无痛集装箱化JBo
- 下一篇: 类固醇上的Java:5种超级有用的JIT