Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有由多个线程调用的方法的Spring组件_Spring_Multithreading_Singleton - Fatal编程技术网

具有由多个线程调用的方法的Spring组件

具有由多个线程调用的方法的Spring组件,spring,multithreading,singleton,Spring,Multithreading,Singleton,我有以下组件,它被多个线程使用,因为侦听器(Kafka consumer)正在调用它 该方法不更改类的状态,但共享另一个组件RuleFactory。它没有任何可变属性 这个方法是线程安全的吗?我得到的答案是,它不是,因为您对作为参数传递的对象应用了更改。这有效吗 除了两个线程传递同一个对象并并行处理它之外,我想不出其他任何情况 这个方法应该同步吗?就线程安全性而言,这个final关键字是否无用?如果以下所有条件均为真,则该方法是线程安全的: 调用的所有ruleFactory方法都是线程安全的,

我有以下组件,它被多个线程使用,因为侦听器(Kafka consumer)正在调用它

该方法不更改类的状态,但共享另一个组件
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
}