0

我有下面的代码,添加看起来对我来说是线程安全的。modifyelement 怎么样,或者我怎样才能使这个线程安全?

ConcurrentNavigableMap<String, List<String>> entries = new ConcurrentSkipListMap<>();
  
 public void record(String key, String value) {
    entries.computeIfAbsent(key, k -> Collections.synchronizedList(new ArrayList<String>())).add(value);
}



    public void modifyelement(String key, String oldval, String newval) {
        entries.computeIfPresent(key, (k , v ) -> {
                v.set(v.indexOf(oldval), newval);
                return v;
            });
        
    }
4

1 回答 1

0

Java 在需要时利用监视器概念来确保线程安全。简单地说,关键变量被视为一个封闭的空间,称为监视器。当一个线程调用包含关键变量的东西时,他可以控制监视器。如果另一个线程现在想进入监视器,他必须等到第一个线程离开临界空间。

synchronized您可以使用关键字将方法标记为关键空间。例子:

public synchronized void doSomething() {}

这确保只有一个线程可以使用该方法。请注意,还有其他方法可以确保线程安全,例如手动放置锁。

现在到您的具体示例, modifyelement 应该同步,因为如果多个线程同时调用它可能会产生副作用。

我希望这个对你有用。:)

问候。

于 2020-11-19T11:23:42.920 回答