java - 为什么java 8注释@Contened使用128字节,这是大多数硬件上缓存行大小的两倍

标签 java multithreading false-sharing

大多数硬件上的缓存行大小为 64 字节。

不知道为什么@Contened在字段或对象前后各填充128字节?

我尝试阅读以下两篇文章来缓解我的困惑。

Pessimistically handling the case of enabled adjacent cache line prefetchers

Note that we use 128 bytes, twice the cache line size on most hardware to adjust for adjacent sector prefetchers extending the false sharing collisions to two cache lines

他们都说使用 128 字节的原因是为了调整相邻扇区预取器,将错误共享冲突扩展到两个缓存行。

但是启用相邻缓存行预取器的情况如何?

最佳答案

通过阅读以下两篇文章,我解决了我的困惑

我总结了为什么使用 128 字节(缓存行大小的两倍)来填充的两个原因

  • 大多数现代主流处理器的缓存行大小都是 64 字节或 128 字节。如果我们用 64 字节填充,这也会导致缓存行大小为 128 的处理器发生错误分片字节。

  • CPU Adjacent Sector Prefetch是Intel处理器特有的一项BIOS功能,当启用此功能时,处理器将获取包含当前请求数据的缓存行,并预取以下内容缓存行,预取可以同时占用两个缓存行

由于这两个原因,我们必须加倍填充大小。

关于java - 为什么java 8注释@Contened使用128字节,这是大多数硬件上缓存行大小的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69799202/

相关文章:

java - 实现responseHandler接口(interface)

java - Jscape 简历上传

java - 获取套接字数据后调用单独的线程进行进一步处理?

c++ - OpenMP阵列性能不佳

java - 用java解析在线xml

java - 创建 YouTubePlayerView 时出错

python - mock.call_count 的线程安全版本

c# - 像在 c# 中一样将整个类作为参数传递给线程 c++

caching - 缓存行乒乓和错误共享相同吗?

go - 我们什么时候应该使用 `CacheLinePad` 来避免虚假共享?