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、總結:
個人理解,線程安全和高性能不可兼得,只有最合適的選擇,沒有最好的選擇