如果我有多个线程想要访问同一个对象中的变量,使用getter,我需要synchronize (var) { var.get(); }
吗?
我敢肯定,如果它是一个setter,它将是必要的,因为任何其他线程都可以设置一个新值。
但是在这种情况下,这个变量只被线程读取而不改变。
但是,多个线程可以同时检查它的值。
我需要同步getter吗?
但是在这种情况下,该变量仅由线程读取而不更改。但是,多个线程可以同时检查它的值。我需要同步getter吗?
细节决定成败。是否可以在多个线程中访问该变量取决于该字段是否为final
,以及该对象是否在之前创建,这些线程是否由启动线程的同一个线程创建。这是Java内存模型在发布类方面提供的唯一保证。
如果字段是final
,那么它保证被适当初始化并且对其他线程可见。如果它不是final,不管线程是否刚刚读取该字段,如果对象是在线程运行后创建的,您将需要对其进行同步(或将其标记为volatile)以更新其内存并确保该字段已被适当初始化。
如果声明变量不变,则不必同步并行读访问。