談談原子變量與鎖的性能比較

正常狀況下基於原子變量實現的效率會比基於鎖的效率高效,由於基於鎖的時候會發生線程間的上下文切換,而原子變量不會。用程序實際測試了一下也確實如此,結論是原子變量的平均效率是鎖效率的3倍左右,代碼以下:java

public class CasAndLockTest {編程

    public static void main(String[] args) {
        LockInteger li = new LockInteger(0);
        AtomicInteger ai = new AtomicInteger(0);
        for (int k = 0; k < 1; k++) {
            new Thread() {
                public void run() {
                    long start = System.currentTimeMillis();
                    for (int i = 0; i < 10000000; i++) {
                        li.incrementAndGet();
                    }
                    long end = System.currentTimeMillis();
                    System.out.println("LockInteger 耗時: " + (end - start));
                }
            }.start();
        }
        for (int k = 0; k < 1; k++) {
            new Thread() {
                public void run() {
                    long start = System.currentTimeMillis();
                    for (int i = 0; i < 10000000; i++) {
                        ai.incrementAndGet();
                    }
                    long end = System.currentTimeMillis();
                    System.out.println("AtomicInteger 耗時: " + (end - start));
                }
            }.start();
        }
    }併發

    private static class LockInteger {
        private int val;性能

        public LockInteger(int val) {
            this.val = val;
        }測試

        public synchronized int incrementAndGet() {
            return ++val;
        }
    }this

}線程

有興趣的能夠本身更改迭代次數k進行測試。但從「java併發編程實戰」中得知:當線程之間高度競爭的時候,鎖的性能會比原子變量高。而實際狀況是還沒測出來,其實緣由比較好理解:鎖在高度競爭時會不斷掛起恢復線程從而讓出cpu使用權給其他的計算資源,原子變量在高度競爭時會一直佔用cpu所以其他的計算資源因飢餓致使變慢。資源

相關文章
相關標籤/搜索