具有由多个线程调用的方法的Spring组件
我有以下组件,它被多个线程使用,因为侦听器(Kafka consumer)正在调用它 该方法不更改类的状态,但共享另一个组件具有由多个线程调用的方法的Spring组件,spring,multithreading,singleton,Spring,Multithreading,Singleton,我有以下组件,它被多个线程使用,因为侦听器(Kafka consumer)正在调用它 该方法不更改类的状态,但共享另一个组件RuleFactory。它没有任何可变属性 这个方法是线程安全的吗?我得到的答案是,它不是,因为您对作为参数传递的对象应用了更改。这有效吗 除了两个线程传递同一个对象并并行处理它之外,我想不出其他任何情况 这个方法应该同步吗?就线程安全性而言,这个final关键字是否无用?如果以下所有条件均为真,则该方法是线程安全的: 调用的所有ruleFactory方法都是线程安全的,
RuleFactory
。它没有任何可变属性
这个方法是线程安全的吗?我得到的答案是,它不是,因为您对作为参数传递的对象应用了更改。这有效吗
除了两个线程传递同一个对象并并行处理它之外,我想不出其他任何情况
这个方法应该同步吗?就线程安全性而言,这个
final
关键字是否无用?如果以下所有条件均为真,则该方法是线程安全的:
- 调用的所有
方法都是线程安全的,也就是说,它们都不会更改ruleFactory
的内部状态ruleFactory
和ruleFilter
是线程安全的casewenner
- 如果另一个线程引用了
,则不能修改sampleObject
的状态sampleObject
RuleFactory
是线程安全的
如果在此函数中修改sampleObject
,并且如果另一个线程引用了sampleObject
,则存在争用条件。只有当所有其他线程使用相同的SampleClass
实例的方法来修改sampleObject
时,同步此函数才会起作用。您可以使用sampleObject
本身,但必须确保访问sampleObject
的所有其他线程也使用同步块:
synchronized(sampleObject) {
// read or write sampleObject
}
synchronuzed(sampleObject)
是否为作为参数传递的每个sampleObject
创建不同的锁?我是否需要在从sampleObject
读取值的区域中使用相同的块?同步块将锁定为当前线程传入的对象实例,因此其他线程无法使用该对象的相同实例进入同步块。要实现无种族限制,您必须在读取和写入sampleObject
时使用同步块。
synchronized(sampleObject) {
// read or write sampleObject
}