发布Interface类型的ImmutableList

时间:2012-09-12 19:10:58

标签: java multithreading immutability

我正在研究一个问题,其中一个类包含一个经常读取的列表,但只是偶尔写入一次。如果我理解正确,下面的类应该是线程安全的,假设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的可变且不是线程安全的版本,那么它可能会失败。我怎么解决这个问题。我可以针对最后一堂课实施,但这是最好的做法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

使用synchronized方法,Thread使用的互斥锁是“this”类(在本例中是MyClass实例)。因此,一次只有一个线程可以将项添加到列表中,因为整个方法是同步的。这与MyInterface无关,MyInterface在这种情况下只是方法的参数。

答案 1 :(得分:0)

MyInterface的实现的(im)可变性对ImmutableList本身没有影响。 add()不会调用对象上的任何方法。

答案 2 :(得分:-1)

首先,您需要使您的get()方法也在MyClass中同步。

此外,java语法中没有任何内容可以强制实现类的不可变性。这是一个创建良好编码指南的问题。