0

我正在处理一个问题,其中一个类包含一个经常阅读的列表,但偶尔只写一次。如果我理解正确,假设 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 的可变而不是线程安全的版本,它可能会失败。我怎么解决这个问题。我可以针对最终课程实施,但这真的是最佳做法吗?

谢谢!

4

3 回答 3

0

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

于 2012-09-12T19:18:04.510 回答
0

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

于 2012-09-12T19:22:18.880 回答
-1

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

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

于 2012-09-12T19:23:01.497 回答