浅谈JAVA的线程安全与性能之间的权衡

简介: 1、StringBuffer 与 StringBuilderStringBuffer自JDK1.0就有了,继承自AbstractStringBuilder类,是线程安全的类,推荐在多线程环境下使用;StringBuilder是JDK1.5才加的,多线程环境下不推荐使用,非线程安全的工具类,但是单线程环境下比StringBuffer性能提高很多;StringBuffer的线程安全是用synchronized实现的,隐式加锁。

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、总结:

个人理解,线程安全和高性能不可兼得,只有最合适的选择,没有最好的选择


目录
相关文章
|
16天前
|
存储 缓存 Java
Java 12相比Java 11有哪些性能上的提升?
Java 12相比Java 11有哪些性能上的提升?
40 3
|
17天前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
199 114
|
20天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
86 1
|
20天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
90 1
|
22天前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
83 8
|
1月前
|
Java Spring
如何优化Java异步任务的性能?
本文介绍了Java中四种异步任务实现方式:基础Thread、线程池、CompletableFuture及虚拟线程。涵盖多场景代码示例,展示从简单异步到复杂流程编排的演进,适用于不同版本与业务需求,助你掌握高效并发编程实践。(239字)
166 6
|
1月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
102 0
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
149 16
|
1月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
138 3

热门文章

最新文章