我有以下代码:
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
只是一个引用而没有创建新对象,如果是这样,为什么我不能同步呢?
答案 0 :(得分:1)
我同意EJP的评论 - 在这种情况下,可以安全地忽略它的“多线程”方面的警告。
但是:我仍然认为警告是“不良做法”的症状。您会看到:外部化该列表给您State
类的用户;更糟糕的是:然后该用户类锁定在该列表上;可能要修改它。
这是好的OO的相反。您将内部实施细节公之于众;你甚至打算修改那个内部数据结构!
在我看来,这违反了各种原则,例如TDA或简单的“信息隐藏”。
因此:回应这个警告;你可能想退后一步,更仔细地看看你的设计;并查看是否有办法让 State 类对其曲目列表进行修改!