用于访问并发集合的同步语法

时间:2017-05-10 06:09:28

标签: java multithreading android-studio synchronization

我有以下代码:

public class State {
    private List<Position> m_track;

    public State() {
        m_track = Collections.synchronizedList(new ArrayList<Position>());
    }

    public List<Position> getTrack() {
        return m_track;
    }
}

// in different class
public void modifyTrack(State _state) {
    List<Position> local_track = _state.getTrack();
    synchronized (local_track) {
        // safely modify track
    }
}

但是Android Studio在行synchronized (local_track)上给了我一个警告:

  

同步局部变量'local_track'报告   同步局部变量或参数。

     

使用此类同步时,很难保证正确性。

     

可以通过例如控制访问来改进这样的代码。一个同步的包装类,或通过在一个字段上同步。

如果我将synchronized (local_track)替换为synchronized (_state.getTrack())警告就会消失。

如果我理解正确,我的local_track只是一个引用而没有创建新对象,如果是这样,为什么我不能同步呢?

1 个答案:

答案 0 :(得分:1)

我同意EJP的评论 - 在这种情况下,可以安全地忽略它的“多线程”方面的警告。

但是:我仍然认为警告是“不良做法”的症状。您会看到:外部化该列表给您State类的用户;更糟糕的是:然后该用户类锁定在该列表上;可能要修改它。

这是好的OO的相反。您将内部实施细节公之于众;你甚至打算修改那个内部数据结构!

在我看来,这违反了各种原则,例如TDA或简单的“信息隐藏”。

因此:回应这个警告;你可能想退后一步,更仔细地看看你的设计;并查看是否有办法让 State 类对其曲目列表进行修改!