热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java并发编程实战-性能与可伸缩性2

1,减少锁的竞争1.1,在并发程序中,对可伸缩性的最主要威胁就是独占方式的资源锁1.2,有两个因素影响锁上发生竞争的可能性:锁的请求频率,每次持有锁的时间2,缩小锁的范围(快进快出)2.1

1,减少锁的竞争

  1.1,在并发程序中,对可伸缩性的最主要威胁就是独占方式的资源锁

  1.2,有两个因素影响锁上发生竞争的可能性:锁的请求频率,每次持有锁的时间
2,缩小锁的范围(快进快出)
  2.1,通过缩小方法中锁的作用范围,能极大地减少在持有锁时需要执行的指令数量。根据Amdahl定律,这样消除了限制可伸缩的一个因素,因为串行代码的总量减少了
  2.2,在实际情况中,仅当可以将一些大量的计算或阻塞操作从同步代码块中移除时,才应该考虑同步代码块的大小,因为过度的将一个同步快拆解为多个同步快时,反而会对性能提升产生负面影响。如果JVM执行粗粒度化优化操作,那么可能会将分拆的同步快再重新合并起来
3,减小锁的粒度
  3.1,锁分解和锁分段:
    3.1.1,采用多个相互独立的锁来保护独立的状态变量,从而改变这些变量由单个的锁来保护的情况,这些技术能减小锁操作的粒度,并能实现高伸缩性,然而使用的锁越多,那么发生死锁的风险就越高
    3.1.2,可以将锁分解技术进一步扩展为对一组独立对象上的锁进行分解,这种情况被称为锁分段。
    3.1.3,ConcurrentHashMap实现了使用一个包含16个锁的数组,每个锁保护所有散列桶的1/16,能够支持多达16个并发的写入器。
4,避免热点:HashMap中每个插入删除操作都会维护一个计数器,以降低size()方法和isEmpty()方法的开销,这样就使得技术器成了“热点域(HotField)”,在ConcurrentHashMap中采用了分段计数器,每个分段锁维护各自独立的值,从而来降低热点
5,使用一个方式替代堵占锁:如:使用发容器,读写锁,不可变对象以及原子变量
6,检测CPU利用率,
  6.1,如果CPU没有得到充分利用,那么需要找出其中的原因:负载不充足,IO密集,外部限制,锁竞争
  6.2,如果CPU保持忙碌状态,并且总会有可运行的线程在等待CPU,那么当增加更多的处理器时,程序的性能可能会得到提升
7,向对象池说不
  7.1,现在Java的分配操作已经比C语言的malloc调用更快,在HotSpot1.4.x和5.0中,new Object的代码大约只包含10条及其指令
  7.2,通常,对象分配操作的开销比同步开销更低

  7.3,当线程分配新的对象时,基本上不需要在线程之间进行协调,因为对象分配器通常会使用线程本地内存块,所以不需要在堆数据结构上进行同步,但是如果这些线程池从对象池中请求一个对象,那么就需要通过某种同步机制来协调对象池数据结构访问,从而可能使某个线程被阻塞

总结

由于使用线程常常是为了充分利用多个处理器的计算能力,因此在并发程序性能的讨论中,通常更多地将侧重点放在吞吐量和可伸缩性上,而不是服务时间。Amdahl定律告诉我们,程序的可伸缩性取决于在所哟嗲买中必须被串行执行的代码比例。因为Java程序中串行操作的主要来源是独占方式的资源锁,因此通常可以通过以下方式来提升可伸缩性:减少锁的持有时间,降低锁的粒度,以及采用非独占的锁或非阻塞锁来替代独占锁


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
author-avatar
szh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有