博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
避免过度同步(67)
阅读量:6307 次
发布时间:2019-06-22

本文共 630 字,大约阅读时间需要 2 分钟。

hot3.png

过度使用同步会导致性能低下、死锁或其他不确定问题

  • 在一个同步方法或代码块中,不要放弃对客户端的控制
    • 即:在一个同步区域内部,不要调用被覆盖方法,或者是传入对象提供的方法 
    • 这些外来方法不可控,会带来各种问题
    • 为了避免死锁和数据破坏,千万不要从同步区域内部调用外来方法

代码详见:

  • 使用可重入锁:当一个线程在操作被该锁保护的数据,另一个持有该锁的不相关操作会带来灾难性后果
  • 将外来方法移除同步代码块(比如代码实例中的notifyElementAdded2),可以解决test1、2出现的异常和死锁

使用并发包(concurrent Collection)

  • CopyOnWriteArrayList 是ArrayList 的一个变体

同步区域内要尽可能少的做操作

同步的性能问题::

  • 永远不要过度使用同步
  • 在多核的时代,会失去并行的机会,会因为要保持内存的一致而导致延迟
  • 过度同步会限制jvm 优化代码的执行

可变类如果需要并发执行:

  • 应该把类设计成线程安全的(内部同步往往比外部锁定性能更高)
  • StringBuffer 内部同步
    • StringBuilder是线程不安全的,而StringBuffer是线程安全的

内部同步了类,可以考虑使用别的方法实现高并发:

  • 比如:分拆锁、分离锁、非阻塞并发控制

如果方法修改了静态域,必须同步这个域的访问

  • 因为外部同步是不可能的

转载于:https://my.oschina.net/u/3847203/blog/2988047

你可能感兴趣的文章
java-学习8
查看>>
AOP动态代理
查看>>
Oracle序列
查看>>
xcodebuild命令行编译错误问题解决
查看>>
Yii2.0 下的 load() 方法的使用
查看>>
华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root
查看>>
LeetCode----67. Add Binary(java)
查看>>
母版页 MasterPage
查看>>
[转] ReactNative Animated动画详解
查看>>
DNS原理及其解析过程
查看>>
记录自写AFNetWorking封装类
查看>>
没想到cnblog也有月经贴,其实C#值不值钱不重要。
查看>>
【转】LUA内存分析
查看>>
springboot使用schedule定时任务
查看>>
[转] Entity Framework Query Samples for PostgreSQL
查看>>
XDUOJ 1115
查看>>
PHP学习(四)---PHP与数据库MySql
查看>>
模版方法模式--实现的capp流程创建与管理
查看>>
软件需求分析的重要性
查看>>
eclipse的scala环境搭建
查看>>