共享数据的getter()是否需要同步?

时间:2014-07-16 18:28:39

标签: java synchronization

想象一下,我有这堂课:

public class SynchTest
{
  private static Object[] objs = new Object[3];

  static
  {
    objs[0] = new Object( );
    objs[1] = new Object( );
    objs[2] = new Object( );
  }

  public static Object getObject(int i)
  {
    return objs[i]
  }
}

并且在多个线程中运行的对象调用方法getObject(int i)。在这种情况下,是否有必要声明getObject(int i)同步?我不这么认为,因为objs数组在静态块中初始化并且从未改变过。但是我想要一个完整性检查:)

提前致谢!

2 个答案:

答案 0 :(得分:2)

你是对的,当一个对象在static初始化块中初始化时,在此之后永远不会写入,而不需要让你的getter synchronized

请注意,这不会使程序成为线程安全的:尽管对对象数组元素的访问不需要同步,但如果这些对象可变,则可能需要同步对单个对象属性的访问

答案 1 :(得分:-1)

这个答案是完全错误的!但是我把它留在了这里因为它出错的原因让我感到意外。请参阅评论主题以获取更多信息。


假设“获取”的数据是不可变的,或者您知道它不会被线程更改,那么只要数据在其他任何线程处于某个状态之前 set 打电话给吸气器,那你很好。

通常,只由多个线程读取的数据始终是线程安全的。