如何测试Java类的线程安全性

缺乏线程安全性导致的问题很难调试,因为它们是零星的,几乎不可能有意复制。你如何测试对象以确保它们是线程安全的?

我在最近的学习中和优锐课老师谈到了这个问题,然后写下了这篇文章。如果你有更深层次的见解,欢迎加入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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值