java死迴圈while(true)vsfor(;;)

迎風勁草發表於2016-12-01

今天在看AtomicInteger的樂觀鎖實現(CAS);讀原始碼發現它的死迴圈式是這麼寫的

/**
     * Atomically decrements by one the current value.
     *
     * @return the previous value
     */
    public final int getAndDecrement() {
        for (;;) {
            int current = get();
            int next = current - 1;
            if (compareAndSet(current, next))
                return current;
        }
    }

採用的是for(;;) 而我常用的習慣是用while(true),這兩者有什麼區別呢。是不是for(;;)要比while(true)快呢?

做了如下測試

/**
 * MainTest
 *
 * @author lilin
 * @date 16/12/1
 */
public class MainTest {
    public static void main(String[] args) {
        forTest();
        whileTest();
    }

    public static void forTest(){
        for(;;){
            System.out.println("for");
        }
    }

    public static void whileTest(){
        while (true){
            System.out.println("while");
        }
    }
}

**編譯 javac -p src/main/java/classes src/main/java/MainTest.java
編譯後的檔案MainTest.class 程式碼如下**

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public class MainTest {
    public MainTest() {
    }

    public static void main(String[] var0) {
        forTest();
        whileTest();
    }

    public static void forTest() {
        while(true) {
            System.out.println("for");
        }
    }

    public static void whileTest() {
        while(true) {
            System.out.println("while");
        }
    }
}

發現最後都變成了while(true) 得出的結論他們最終的效果應該是一樣的 。


相關文章