加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

最佳的java线程安全对象池

发布时间:2020-12-15 02:30:33 所属栏目:Java 来源:网络整理
导读:我并不熟悉 Java的并发库,因此对于以下问题,我通常只编写自己的互斥锁管理代码,但我担心随着servlet流量的增加,互斥体会降低系统速度. 第一个需要是使用一组有限的String键,我需要先查找,否则创建并发布一个昂贵的对象.这意味着在一个天真的实现上有一个全局
我并不熟悉 Java的并发库,因此对于以下问题,我通常只编写自己的互斥锁管理代码,但我担心随着servlet流量的增加,互斥体会降低系统速度.

第一个需要是使用一组有限的String键,我需要先查找,否则创建并发布一个昂贵的对象.这意味着在一个天真的实现上有一个全局互斥.还有更好的东西吗?

第二个需要是每个昂贵的对象都有一个等效工人的软池,其中任何一个都足以执行.这些工人的创建成本比工厂的工厂便宜,但它们仍然很昂贵,需要汇集.一个简单的实现将为每个工厂安装一个互斥锁,并从软缓存中检出一个工作人员,或者如果没有可用的话就创建它.但是由于很多servlet调用使用相同的工厂(可能),这个互斥锁也会成为一个争论的焦点.

当然,对于2个互斥体,我绝对可以最大限度地减少在同步语句中花费的时间,但我在两种情况下都在寻找更好的东西.也许两者都有一个非阻塞的解决方案?

安迪

解决方法

对于第一部分:而不是将昂贵的对象直接放入HashMap,而是创建一个创建起来便宜的简单包装器.然后,您基本上在包装器getExpensiveObject()方法中按需创建昂贵的对象 – 尽管如果这是首选的话,显然可以立即触发创建.在任何一种情况下,你都必须同步get方法,但是这可以通过双重检查锁定来廉价地完成 – 通常我们只是用volatile读取替换普通读取并且仅在创建对象时具有昂贵的同步.

这假设您正在使用各种类型的ConcurrentHashMap,因为我们需要putIfAbsent或一些等效方法才能工作(我们不想用空包装器替换现有的昂贵对象)

现在没时间考虑第二个问题,也许以后.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读