【发布时间】:2017-12-01 03:46:59
【问题描述】:
我正在教授 Java 并发编程,并想向学生展示使用非线程安全数据结构可能出现的问题。我创建了以下程序:
Map<String,String> favoriteFoods = new HashMap<>();
Thread t1 = new Thread(() -> {
favoriteFoods.put("Alice","avocado");
favoriteFoods.put("Bob","banana");
});
Thread t2 = new Thread(() -> {
favoriteFoods.put("Alice","aloysia");
favoriteFoods.put("Carl","candy");
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(favoriteFoods);
从两个不同的线程访问非线程安全的 HashMap。但是,该程序每次运行时都能正常运行。
如何更改代码以演示问题?
【问题讨论】:
-
病态地思考。在您的匿名
Thread实例中放置循环,并删除joins中的一个或两个... -
这确实是一个Computer Science Educators 问题,可能应该迁移到那里。此外,听起来您可能对那个网站感兴趣:)
标签: java concurrency thread-safety