【发布时间】:2020-03-20 23:20:22
【问题描述】:
什么对性能更有利?假设没有或几乎没有争吵
- 具有可变字段并一一更新的可变类
- 具有最终字段的不可变类,更新周期避免了 多字段更新,而是重新创建一次类
Volatiles 在每次写入时都需要内存屏障,我想 final 字段也是如此?意味着对象构造时的单一内存屏障?
更新说明:
考虑到 java 内存模型和当前的一代硬件,我觉得这个问题本身很有价值,并且可以笼统地回答。如果你必须假设细节:
- 对象当然是从多个线程访问的,否则这个练习将毫无意义
- 单个对象的寿命很长,例如几个小时
- 这些对象有成百上千个,每秒有成百上千个更新事件
【问题讨论】:
-
尝试写入最终字段将在编译时被捕获。
-
没有足够的信息来回答这个问题。这取决于你对这些对象做了什么。不可变对象通常是一个很好的设计,但如果您要进行大量更改,频繁创建数百个新的不可变对象可能会影响性能。仅当您从不同线程修改对象时,可变字段才重要。
-
如果您已经完成了足够的分析来担心这一点,那么您已经完成了足够的分析以获得数据来回答您的问题。这闻起来像双加过早的优化。
标签: java concurrency memory-model