Java Spring和同步的部分方法

Java Spring和同步的部分方法,java,multithreading,spring,static,synchronized,Java,Multithreading,Spring,Static,Synchronized,我有一个经理是Spring wired bean。我相信默认情况下为spring定义的每个bean都是作为单例连接的。我在这个bean中有一些方法需要同步。 那我该怎么做-- 或 ?除非您正在访问可变的静态类变量(一开始可能很讨厌),否则第一种方法是适当的同步方法 请理解,虽然Spring只创建了一个单例bean实例,并将其用于依赖于该类型bean的任何人,但单例并不是一个静态实体。没有编译器约束阻止您自己在Spring上下文之外实例化该类。这只是唯一的一个例子,因为Spring知道不需要更多地

我有一个经理是Spring wired bean。我相信默认情况下为spring定义的每个bean都是作为单例连接的。我在这个bean中有一些方法需要同步。 那我该怎么做--


除非您正在访问可变的静态类变量(一开始可能很讨厌),否则第一种方法是适当的同步方法

请理解,虽然Spring只创建了一个单例bean实例,并将其用于依赖于该类型bean的任何人,但单例并不是一个静态实体。没有编译器约束阻止您自己在Spring上下文之外实例化该类。这只是唯一的一个例子,因为Spring知道不需要更多地使用它们。。。不是因为它做不到。我想在这里指出的一点是,在类级数据和单例数据之间画一个平行线是不正确的


因此,同步应该发生在尽可能窄的范围内。在您的情况下,这意味着在包含共享数据的对象实例上进行同步,而不是在整个类的更大范围上进行同步。

两者的主要区别在于,在第一种情况下,类的实例作为监视器,第二种情况下使用类作为监视器

在您的案例中,第一种方法可能是可行的,因为在不久的将来,如果您决定拥有多个类实例,它们的方法将在各自的实例上同步。与使用类作为监视器不同,如果一个线程在一个实例上调用同步方法,则其他线程将无法在同一个类的任何实例上调用方法(已同步的方法)

void zzz() {
 synchronized (this) {
   ...
 }
}
void zzz() {
 synchronized (MyClass.class) {
   ...
 }
}