淺談JAVA的線程安全與性能之間的權衡

1、StringBuffer 與 StringBuilder

StringBuffer自JDK1.0就有了,繼承自AbstractStringBuilder類,是線程安全的類,推薦在多線程環境下使用;
StringBuilder是JDK1.5才加的,多線程環境下不推薦使用,非線程安全的工具類,但是單線程環境下比StringBuffer性能提高很多;StringBuffer的線程安全是用synchronized實現的,隱式加鎖。

經過代碼多次運行測試,單線程環境下StringBuilder的性能比StringBuffer略高:
測試代碼:

        System.out.println("========StringBuilder======");
        long start2 = System.currentTimeMillis();
        for(int i=0;i<1000000;i++){
            StringBuilder sb = new StringBuilder();
            sb.append(3.1415926);
            sb.append("test welcome to java world");
            sb.append(true);
            sb.toString();
        }
        System.out.println(System.currentTimeMillis() - start2 + "mills");
        
        System.out.println("========StringBuffer======");
        long start = System.currentTimeMillis();
        for(int i=0;i<1000000;i++){
            StringBuffer sb = new StringBuffer();
            sb.append(3.1415926);
            sb.append("test welcome to java world");
            sb.append(true);
            sb.toString();
        }
        System.out.println(System.currentTimeMillis() - start + "mills");
測試結果:

========StringBuilder======
1861mills
========StringBuffer======
2042mills


2、Hashtable、ConcurrentHashMap 與 HashMap
Hashtable自JDK1.0就有了,是線程安全的散列容器,HashMap是JDK1.2纔開始加的,多線程環境下不推薦使用,非線程安全的,
但是單線程環境下比Hashtable性能提高很多;ConcurrentHashMap是JDK1.5纔開始加的,是線程安全的,多線程環境下推薦使用;
Hashtable的線程安全是用synchronized實現的,而ConcurrentHashMap是基於顯示的lock;

synchronized的用法:


public synchronized V put(K key, V value) {

    // do something

}
lock的用法:
V put(K key, int hash, V value, boolean onlyIfAbsent) {
    lock();
    try {

        // do something

    } finally {
        unlock();
    }
}

3、總結:

個人理解,線程安全和高性能不可兼得,只有最合適的選擇,沒有最好的選擇


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章