`
swingboat
  • 浏览: 60331 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

同步(synchronized)对程序性能的影响!

    博客分类:
  • java
阅读更多
在使用多线程时,可能会访问一些全局的数据,这时必然会使用同步机制来使程序按照一定顺序来执行,这样程序的性能也会下降。所以一定要慎用同步,正确用同步。看下面的程序
        int curIndex = 0;
        AuditQueueEntry aqe;
        
synchronized (localCriticalSection) {      
            
while (curIndex < theList.size()) {
                aqe 
= (AuditQueueEntry) theList.get(curIndex);
                
if (aqe.getTrailId() == theTrailId) {
                    theList.remove(curIndex);
                }
 else {
                    curIndex
++;
                }

            }

        }

localCriticalSection做为一个信号量来控制程序对类成员变量theList的访问,从而保证了theList在同一时间只有一个程序访问。运行程序,这个函数花费了将近4秒钟。同步是很耗时间的。
在java.util.Collections中提供了很多方法来保证集合(数组)的同步访问。
我们修改类成员变量theList的实例化方法:
theList = Collections.synchronizedList(new LinkedList());

再修改处理函数:
        int curIndex = 0;
        AuditQueueEntry aqe;
//        synchronized (localCriticalSection) {
        synchronized(theList) {    
            
while (curIndex < theList.size()) {
                aqe 
= (AuditQueueEntry) theList.get(curIndex);
                
if (aqe.getTrailId() == theTrailId) {
                    theList.remove(curIndex);
                }
 else {
                    curIndex
++;
                }

            }

        }

再运行,这个函数才花费将近一秒钟的时间!
在Collections中提供了很多这类的方法。
分享到:

相关推荐

    java关键字Synchronized详解

    ava中的关键字synchronized是一种用于实现线程同步的机制。它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下的数据竞争和不一致问题。 在Java中...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    同步控制 3.2线程复用:线程池 3.3不要重复发明轮子:jdk的并发容器 3.4使用jmh进行性能测试 3.2线程复用:线程池 3.3不要重复发明轮子:JDK的并发容器 3.4使用JMH进行性能测试 实战Java高并发程序设计(第2版)PPT...

    Java各种锁的使用方式及其对比

    Java中使用锁是为了在多线程程序中保证同步访问共享资源的正确性和一致性。在多线程环境下,多个线程可以同时访问共享资源,这可能导致数据的不一致性和错误的结果。例如,如果两个线程同时更新同一个变量,那么可能...

    Java-并发(Concurrent)编程

    高性能应用程序的一把钥匙,应用程序的翅膀,面试高频的考点 中间件几乎都是多线程应用:MySQL、ES、Redis,Tomcat,Druid,HikariCP... 怎么学并发编程? 多线程核心知识(概念、线程状态、线程安全问题、三大特性...

    什么是线程?Java中如何创建和管理线程?(java面试题附答案).txt

    通过将 MyRunnable 对象传递给 Thread 类的构造方法,我们创建了一个新的线程,并将 run 方法...通过合理地创建和管理线程,我们可以实现复杂的并发执行逻辑,提高程序的性能和响应能力,并确保线程之间的安全和协调。

    基于角色的消息传递框架Kilim.zip

    编译新创建的支持并发性的类之后,对其运行 Kilim 的 weaver,您会实现显著的性能提升! Kilim 最初是一种外来语言,但它带来了巨大的回报。角色模型(以及后来的 Kilim)使编写依赖于类似对象的异步操作对象变得...

    java并发编程:线程基础

    解释为什么多线程可以提高程序性能和资源利用率。 线程的创建: 详细讲解线程的创建方式,包括继承 Thread 类和实现 Runnable 接口。演示如何通过这些方式来创建和启动线程。 线程的生命周期: 解释线程的生命周期,...

    Java多线程编程.docx

    在网络编程中,可以使用多线程来处理不同的网络连接和数据传输任务,以提高网络应用程序的性能和可扩展性。 2. 图形用户界面编程 在图形用户界面编程中,可以使用多线程来处理不同的用户界面事件和任务,以提高...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    Java并发编程实战

    如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。 本书适合Java...

    Java 7并发编程实战手册

    java7在并发编程方面,带来了很多令人激动的新功能,这将使你的应用程序具备更好的并行任务性能。 《Java 7并发编程实战手册》是Java 7并发编程的实战指南,介绍了Java 7并发API中大部分重要而有用的机制。全书分为9...

    通过内存布局带你掌握锁升级过程

    加锁可以使一段代码在同一时间只有一个线程可以访问,在增加安全性的同时,牺牲掉的是程序的执行性能,所以为了在一定程度上减少获得锁和释放锁带来的性能消耗,在 jdk6 之后便引入了“偏向锁”和“轻量级锁”,所以...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    java面试宝典2012版.pdf

    64、说出ArrayList,Vector, LinkedList的存储性能和特性 65、去掉一个Vector集合中重复的元素 66、Collection 和 Collections的区别。 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是...

    单例模式讲解说明与实例

    在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。 单例模式的优点是避免不一致状态,避免政出多头。例如,在计算机系统中,每台...

    java面试题

    DOM:处理大型文件时性能下降的非常厉害,适合对xml的随机访问 SAX:事件驱动型的xml解析方法,适合对xml的顺序访问 jsp常用动作? 答:jsp:include 引入一个文件 jsp:useBean 实例化JavaBean jsp:setProperty ...

    进销存系统文档作业例子

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

Global site tag (gtag.js) - Google Analytics