如何编写线程安全但可伸缩的类
编写线程安全类时,主要问题是将数据分为多个独立的部分,并为这些部分选择合适的大小。如果部分太小,则我们的类不是线程安全的。如果部件太大,则该类不可扩展。 让我们看一个进一步说明这种情况的示例: 一个例子 假设我们要跟踪一个城市中有多少人。我们要支持两种方法,一种是获取当前居住在城市中的人数,另一种是将一个人从一个城市转移到另一个城市。因此,我们有以下界面: 由于我们要从多个线程并行使用此接口,因此必须选择实现此接口的选项。使用该类 java.util.concurrent. ConcurrentHashMap 或使用该类 java.util.HashMap 和一个锁。这是使用类的实现 java.util.concurrent.ConcurrentHashMap : 方法移动使用线程安全方法计算来减少源城市中的计数。然后,使用计算来增加目标城市中的计数。count方法使用线程安全方法 get 。 这是使用该类的实现 java.util.HashMap : 该方法 move 还使用该方法 compute 来增加和减少源城市和目标城市中的计数。仅在这一次,因为该 compute 方法不是线程安全的,所以两个方法都被同步块包围。该 count 方法 get 再次使用被同步块包围的方法。 两种解决方案都是线程安全的。 但是在使用的解决方案中 ConcurrentHashMap