内存模型描述了程序的可能行为,实现可以自由地生成代码,只要程序的执行结果与内存模型预测的一致即可。这为实现者提供了执行代码转换的自由,包括重排序及删除不必要的同步。
volatile
通常,为了确保共享变量一致且可靠地更新,线程应该通过获取锁来确保它独占使用这些变量,该锁通常对这些共享变量强制互斥。Java 编程语言提供了第二种机制,即 volatile
字段,在某些场景下,它比使用锁更方便。一个字段可以被声明为 volatile
,在这种情况下,Java 内存模型确保所有线程看到变量的一致值。
FileLock
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.
Reference
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
Factory
最近处理应用性能问题时分析栈帧时发现部分线程名称为类似 pool-15-thread-2841 的模式,经过排查,原因为开发创建自定义线程池时未指定线程工厂导致,默认会使用 Executors.defaultThreadFactory()
实现。
Collections.shuffle(List>)
Java 中 Collections.shuffle(List<?>)
方法的实现基于 Fisher–Yates shuffle 算法,核心的思想用几行代码即可表述:
1 | for (int i = size; i > 1; i--){ |
在 Collections.shuffle(List<?>)
方法实现中对不支持随机访问的数据结构进行了适配,如当前 List<?>
实现为链表时,在元素个数大于等于 5 个时,先将链表转换为支持随机访问的数据结构:数组,然后再对每个索引上的元素进行交换,最后再转换回链表,以保证算法运行时间为线性时间。