Java 如何锁定(同步)静态类?

Java 如何锁定(同步)静态类?,java,class,static,synchronized,Java,Class,Static,Synchronized,我正在创建一个静态类,它将保存一些带有信息的向量。 我必须使它同步,以便在有人编辑或读取向量时锁定类 最好的方法是什么 在类中同步一个函数是否足够: public synchronized insertIntoVector(int id) { } 提前感谢:)首先,您需要准确定义“静态类”的含义。起初,我认为您指的是一个所有方法都是静态的类(并不意味着要实例化),但您的代码片段表明情况并非如此 在任何情况下,如果类中的同步方法是实例方法,则它们等价于synchronized(this);如果

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

最好的方法是什么

在类中同步一个函数是否足够:

public synchronized insertIntoVector(int id)
{

}

提前感谢:)

首先,您需要准确定义“静态类”的含义。起初,我认为您指的是一个所有方法都是静态的类(并不意味着要实例化),但您的代码片段表明情况并非如此

在任何情况下,如果类中的同步方法是实例方法,则它们等价于
synchronized(this)
;如果它们是静态方法,则它们等价于
synchronized(containingclassname.class)

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


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

首先,您需要准确定义“静态类”的含义。起初,我认为您指的是一个所有方法都是静态的类(并不意味着要实例化),但您的代码片段表明情况并非如此

在任何情况下,如果类中的同步方法是实例方法,则它们等价于
synchronized(this)
;如果它们是静态方法,则它们等价于
synchronized(containingclassname.class)

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


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

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

public static synchronized void insertIntoVector(int id) {

}
相对于类对象进行同步,如果只有静态方法并且所有方法都是同步的,这就足够了

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


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

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

public static synchronized void insertIntoVector(int id) {

}
相对于类对象进行同步,如果只有静态方法并且所有方法都是同步的,这就足够了

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


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

我想要的是一个不应实例化的类。但是当一些函数被使用时,整个类都应该被锁定。看起来Andrzej Doyle的假设是正确的。结论:同步静态方法就足够了,因为它们都是针对YourClass.class同步的。同时也要注意方法内部的代码!!另外一点:如果仅在同步方法中访问向量,则可以使用ArrayList而不是vector。您先前的同步将阻止未同步的访问,因此您不需要VectorHanks对附加信息@Hardcoded进行附加同步,现在更改为ArrayList:)我想要的是一个不应实例化的类。但是当一些函数被使用时,整个类都应该被锁定。看起来Andrzej Doyle的假设是正确的。结论:同步静态方法就足够了,因为它们都是针对YourClass.class同步的。同时也要注意方法内部的代码!!另外一点:如果仅在同步方法中访问向量,则可以使用ArrayList而不是vector。您先前的同步将阻止未同步的访问,因此您不需要VectorHanks对附加信息@Hardcoded进行附加同步,现在更改为ArrayList:)