处理器使用不同级别的缓存,当处理器从主内存读取值时,可能会将该值缓存以提高性能。实际上,大多数现代处理器不仅仅缓存请求的值,而是会将该值附近的数据同时进行缓存。这种优化基于空间局部性的思想,可以显著提高应用程序的整体性能。简单来说,处理器缓存工作在缓存行上,而不是对单个请求的值进行缓存。
我们可以看一个例子,假设有两个 CPU 核心 core A 及 core B 将要对内存临近位置上的两个变量进行访问,如下图:

处理器使用不同级别的缓存,当处理器从主内存读取值时,可能会将该值缓存以提高性能。实际上,大多数现代处理器不仅仅缓存请求的值,而是会将该值附近的数据同时进行缓存。这种优化基于空间局部性的思想,可以显著提高应用程序的整体性能。简单来说,处理器缓存工作在缓存行上,而不是对单个请求的值进行缓存。
我们可以看一个例子,假设有两个 CPU 核心 core A 及 core B 将要对内存临近位置上的两个变量进行访问,如下图:
内存模型描述了程序的可能行为,实现可以自由地生成代码,只要程序的执行结果与内存模型预测的一致即可。这为实现者提供了执行代码转换的自由,包括重排序及删除不必要的同步。
通常,为了确保共享变量一致且可靠地更新,线程应该通过获取锁来确保它独占使用这些变量,该锁通常对这些共享变量强制互斥。Java 编程语言提供了第二种机制,即 volatile
字段,在某些场景下,它比使用锁更方便。一个字段可以被声明为 volatile
,在这种情况下,Java 内存模型确保所有线程看到变量的一致值。
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine.
FileLock (Java Platform SE 8 )
OverlappingFileLockException (Java Platform SE 8 )
Is FileLock in java safe across multiple threads within the same process or between different processes or both?
Example of inter-process and inter-thread file locking in Java · GitHub
最近处理应用性能问题时分析栈帧时发现部分线程名称为类似 pool-15-thread-2841 的模式,经过排查,原因为开发创建自定义线程池时未指定线程工厂导致,默认会使用 Executors.defaultThreadFactory()
实现。