0

我正在创建一个静态类,它将保存一些带有信息的向量。我必须使其同步,以便在有人正在编辑或读取向量时锁定课程。

做这个的最好方式是什么?

有一个像这样在类内部同步的函数是否足够:

public synchronized insertIntoVector(int id)
{

}

提前致谢 :)

4

2 回答 2

5

首先,您需要准确定义“静态类”的含义。起初,我以为您的意思是一个所有方法都是静态的类(不打算实例化)-但您的代码片段暗示情况并非如此。

在任何情况下,类中的同步方法等价于synchronized(this)它们是实例方法还是synchronized(TheContainingClassName.class)静态方法。

如果您正在创建一个包含所有静态方法的不可实例化类,或者您正在创建一个将充当单例的类,那么同步该类的每个方法将确保一次只有一个线程可以调用方法。

如果可能,请尽量确保您的方法是原子的;对不同方法的调用可以由其他线程交错,因此如果在其间调用另一个线程,则类似getFoo()调用后跟 a setFoo()(可能在增加 foo 变量之后)可能不会产生预期的效果。setFoo()最好的方法是使用一种方法,例如incrementFoo();或者(如果这不可能)您可以发布同步详细信息,以便您的调用者可以在整个调用序列期间手动锁定类/实例。

于 2010-02-24T09:01:31.720 回答
1

AFAIK,Java中没有“静态类”这样的东西。你的意思是一个只包含静态方法的类吗?如果是这样,那么

public static synchronized void insertIntoVector(int id) {

}

相对于类 object同步,如果只有静态方法并且所有这些方法都是同步的,这就足够了。

如果您的意思是静态内部类(其中“静态”一词的含义与静态方法中的含义不同),那么

public synchronized void insertIntoVector(int id)
{

}

与该静态内部类的实例同步。

于 2010-02-24T09:10:37.413 回答