缺乏线程安全性导致的问题很难调试,因为它们是零星的,几乎不可能有意复制。你如何测试对象以确保它们是线程安全的?
我在最近的学习中和优锐课老师谈到了这个问题,然后写下了这篇文章。如果你有更深层次的见解,欢迎加入Java学习资料交流qq群:907135806与我们一起探讨。
线程安全是Java等语言/平台中类的重要素质,我们经常在线程之间共享对象。缺乏线程安全性导致的问题很难调试,因为它们是零星的,几乎不可能有意复制。你如何测试对象以确保它们是线程安全的?这就是我的做法。
假设有一个简单的内存书架:
class Books {
final Map<Integer, String> map =
new ConcurrentHashMap<>();
int add(String title) {
final Integer next = this.map.size() + 1;
this.map.put(next, title);
return next;
}
String title(int id) {
return this.map.get(id);
}
}
首先,我们将一本书放在那里,书架返回其ID。然后,我们可以通过ID读取该书的标题:
Books books = new Books();
String title = "Elegant Objects";
int id = books.add(title);
assert books.title(id).equals(title);
该类似乎是线程安全的,因为我们使用的是线程安全的ConcurrentHashMap而不是更原始的和非线程安全的HashMap,对吗? 让我们尝试测试一下:
class BooksTest {
@Test
public void addsAndRetrieves() {
Books books = new Books();
String title = "Elegant Objects";
int id = books.add(title)