正常狀況下基於原子變量實現的效率會比基於鎖的效率高效,由於基於鎖的時候會發生線程間的上下文切換,而原子變量不會。用程序實際測試了一下也確實如此,結論是原子變量的平均效率是鎖效率的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所以其他的計算資源因飢餓致使變慢。資源