想象一下,我有这堂课:
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数组在静态块中初始化并且从未改变过。但是我想要一个完整性检查:)
提前致谢!
答案 0 :(得分:2)
你是对的,当一个对象在static
初始化块中初始化时,在此之后永远不会写入,而不需要让你的getter synchronized
。
请注意,这不会使程序成为线程安全的:尽管对对象数组元素的访问不需要同步,但如果这些对象可变,则可能需要同步对单个对象属性的访问
答案 1 :(得分:-1)
这个答案是完全错误的!但是我把它留在了这里因为它出错的原因让我感到意外。请参阅评论主题以获取更多信息。
假设“获取”的数据是不可变的,或者您知道它不会被线程更改,那么只要数据在其他任何线程处于某个状态之前 set 打电话给吸气器,那你很好。
通常,只由多个线程读取的数据始终是线程安全的。