我正在创建一个静态类,它将包含一些带有信息的向量。 我必须使它同步,以便在有人正在编辑或从向量中读取时,类将被锁定。
这样做的最佳方式是什么?
是否足以拥有一个在类内部同步的函数,如下所示:
public synchronized insertIntoVector(int id)
{
}
提前致谢:)
答案 0 :(得分:5)
首先,您需要准确定义“静态类”的含义。起初,我认为你的意思是所有方法都是静态的(这并不是为了实例化) - 但是你的代码片段暗示情况并非如此。
在任何情况下,如果类中的同步方法是实例方法,则它们等效于synchronized(this)
,如果它们是静态方法,则等同于synchronized(TheContainingClassName.class)
。
如果您要么使用所有静态方法创建一个不可实例化的类,或者如果您要创建一个将充当单例的类,那么同步该类的每个方法将确保只有一个线程可以调用方法一次。
尽可能确保你的方法是原子的;对其他线程的调用可以由其他线程进行交错,因此,如果另一个线程调用{{1},那么getFoo()
调用后跟setFoo()
(可能在递增foo变量之后)之类的东西可能不会产生预期的效果。 inbetween。最好的方法是使用setFoo()
之类的方法;或者(如果这不可能)您可以发布同步详细信息,以便您的调用者可以在整个调用序列期间手动锁定类/实例。
答案 1 :(得分:1)
AFAIK,Java中没有“静态类”这样的东西。你的意思是只包含静态方法的类吗?如果是,那么
public static synchronized void insertIntoVector(int id) {
}
与类对象同步,如果只有静态方法并且所有这些方法都是同步的,这就足够了。
如果你的意思是静态内部类(其中“静态”一词的含义与静态方法不同),那么
public synchronized void insertIntoVector(int id)
{
}
与该静态内部类的实例同步。