本文共 1693 字,大约阅读时间需要 5 分钟。
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、总结:
个人理解,线程安全和高性能不可兼得,只有最合适的选择,没有最好的选择
转载地址:http://pfdeo.baihongyu.com/