我正在研究一个问题,其中一个类包含一个经常读取的列表,但只是偶尔写入一次。如果我理解正确,下面的类应该是线程安全的,假设MyInterface是不可变的:
public class MyClass{
private volatile ImmutableList<MyInterface> list = ImmutableList.of();
public List<MyInterface> get(){
return list;
}
public synchronized add(MyInterface obj)
list = ImmutableList.builder().addAll(list).add(obj).build();
}
}
但如果某人实现了MyInterface的可变且不是线程安全的版本,那么它可能会失败。我怎么解决这个问题。我可以针对最后一堂课实施,但这是最好的做法吗?
谢谢!
答案 0 :(得分:0)
使用synchronized方法,Thread使用的互斥锁是“this”类(在本例中是MyClass实例)。因此,一次只有一个线程可以将项添加到列表中,因为整个方法是同步的。这与MyInterface无关,MyInterface在这种情况下只是方法的参数。
答案 1 :(得分:0)
MyInterface的实现的(im)可变性对ImmutableList本身没有影响。 add()不会调用对象上的任何方法。
答案 2 :(得分:-1)
首先,您需要使您的get()方法也在MyClass中同步。
此外,java语法中没有任何内容可以强制实现类的不可变性。这是一个创建良好编码指南的问题。