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