【发布时间】:2010-02-24 08:54:02
【问题描述】:
我正在创建一个静态类,它将保存一些带有信息的向量。 我必须使其同步,以便在有人编辑或读取向量时锁定课程。
最好的方法是什么?
有一个像这样在类内部同步的函数是否足够:
public synchronized insertIntoVector(int id)
{
}
提前致谢:)
【问题讨论】:
标签: java class static synchronized
我正在创建一个静态类,它将保存一些带有信息的向量。 我必须使其同步,以便在有人编辑或读取向量时锁定课程。
最好的方法是什么?
有一个像这样在类内部同步的函数是否足够:
public synchronized insertIntoVector(int id)
{
}
提前致谢:)
【问题讨论】:
标签: java class static synchronized
首先,您需要准确定义“静态类”的含义。起初,我以为您的意思是所有方法都是静态的(不打算实例化)的类 - 但您的代码 sn-p 暗示情况并非如此。
在任何情况下,类中的同步方法如果是实例方法则等价于synchronized(this),如果是静态方法则等价于synchronized(TheContainingClassName.class)。
如果您正在创建一个包含所有静态方法的不可实例化类,或者如果您正在创建一个将充当单例的类,那么同步该类的每个方法将确保只有一个线程可以在一次。
如果可能,请尽量确保您的方法是原子的;对不同方法的调用可以由其他线程交错,因此如果另一个线程调用setFoo(),则类似getFoo() 调用后跟setFoo()(可能在增加 foo 变量之后)可能不会产生预期的效果。最好的方法是使用诸如incrementFoo() 之类的方法;或者(如果这不可能)您可以发布同步详细信息,以便您的调用者可以在整个调用序列期间手动锁定类/实例。
【讨论】:
AFAIK,Java 中没有“静态类”之类的东西。你的意思是一个只包含静态方法的类吗?如果是的话,那么
public static synchronized void insertIntoVector(int id) {
}
相对于类对象同步,如果只有静态方法并且所有方法都同步,这就足够了。
如果您的意思是静态内部类(其中“静态”一词的含义与静态方法中的不同),那么
public synchronized void insertIntoVector(int id)
{
}
相对于该静态内部类的实例进行同步。
【讨论】: