主要观点:测试多线程并发 Java 代码困难,因每次测试运行仅捕获一种可能的线程交错且交错是非确定性的,为此创建了开源工具 VMLens 以确定性和可重现方式测试并发 Java 代码。
关键信息:
- 给出一个简单的并发
Address
类示例,包括获取和更新地址的方法。 - 测试中出现数据竞争错误,因读和写操作间无同步,添加
volatile
修饰符后仍有问题,如出现部分更新的地址。 - 引入
ReentrantLock
解决部分更新问题,测试成功。 - 还缺少对从两个线程并行更新类的测试,现有的技术如
java.util.concurrent
虽能利用多核,但缺少测试正确性的方法。
重要细节: - 测试代码通过
AllInterleavings
循环遍历所有可能的执行顺序来覆盖线程交错。 - 数据竞争在两个线程同时访问同一字段且无适当同步时发生,会导致线程看到非最新值,
Java Memory Model
中对同步动作和数据竞争有正式定义。 - 在
update
和getStreetAndCity
方法中使用ReentrantLock
实现同步,确保线程安全。 - 随着 CPU 核心数增加,需要更好的测试方法来验证多线程代码的正确性,VMLens 有望填补此空白。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。