Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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
Scala-如何确定对象是否是线程安全的?_Scala_Concurrency - Fatal编程技术网

Scala-如何确定对象是否是线程安全的?

Scala-如何确定对象是否是线程安全的?,scala,concurrency,Scala,Concurrency,如果此实现不是线程安全的,如何使其成为线程安全的 将使用不同的输入同时调用此函数。需要考虑的一件事是,当两个不同的线程调用同一函数或与同一对象交互时,应用程序的“状态”可能会发生怎样的变化。在这种情况下,您的“状态”可能是“写入的内容超出流” 考虑以下场景: object GetDetails{ def apply(outStream: java.io.Writer, someObject: SomeClass){ outStream.write(someObject.detail1

如果此实现不是线程安全的,如何使其成为线程安全的


将使用不同的输入同时调用此函数。

需要考虑的一件事是,当两个不同的线程调用同一函数或与同一对象交互时,应用程序的“状态”可能会发生怎样的变化。在这种情况下,您的“状态”可能是“写入
的内容超出流”

考虑以下场景:

object GetDetails{
  def apply(outStream: java.io.Writer, someObject: SomeClass){
    outStream.write(someObject.detail1) //detail1 is string
    outStream.write(someObject.detail2) //detail2 is also string
    outStream.flush()
  }
}
两个单独的线程都调用
GetDetails
,共享相同的
outStream
。这是一个潜在的并发问题,因为写入
outStream
的数据不能保证以任何特定顺序进行。您可能会得到
[object1.detail1、object2.detail1、object1.detail2、object2.detail2]
,或者
[object2.detail1、object1.detail1、object1.detail2、object2.detail2]
等等

GetDetails.apply
不会更改任何
GetDetails
的状态,但会更改您传递的
编写器的状态;为了确保线程安全,您必须努力避免同时使用同一个Writer(即上面的场景)

作为反驳,这里有一个非常好的线程-un安全方法:

Thread 1                                 Thread 2
--------------------                     -------------------------------
GetDetails(outStream, object1)
                                         GetDetails(outStream, object2)
  outStream.write(object1.detail1)
                                           outStream.write(object2.detail1)
  outStream.write(object1.detail2)
                                           outStream.write(object2.detail2)
                                           outStream.flush()
  outStream.flush()
objectnotthreadsafe{
//可变态
私有变量currentPrefix=“”
def倒计时(前缀:字符串)={
//红旗:更改可变状态,然后引用它
currentPrefix=前缀

对于(i需要考虑的一件事是,当两个不同的线程调用同一个函数或与同一个对象交互时,应用程序的“状态”可能会发生怎样的变化。在这种情况下,您的“状态”可能是“写入
的内容超出流”

考虑以下场景:

object GetDetails{
  def apply(outStream: java.io.Writer, someObject: SomeClass){
    outStream.write(someObject.detail1) //detail1 is string
    outStream.write(someObject.detail2) //detail2 is also string
    outStream.flush()
  }
}
两个单独的线程都调用
GetDetails
,共享相同的
outStream
。这是一个潜在的并发问题,因为写入
outStream
的数据不保证按任何特定顺序。您可能会得到
[object1.detail1,object2.detail1,object1.detail2,object2.detail2]
,或
[object2.detail1、object1.detail1、object1.detail2、object2.detail2]
,依此类推

GetDetails.apply
不会更改
GetDetails
的任何状态,但会更改您传递的
编写器的状态;为了确保线程安全,您必须努力避免同时使用同一编写器(即上述场景)

作为反驳,这里有一个非常好的线程-un安全方法:

Thread 1                                 Thread 2
--------------------                     -------------------------------
GetDetails(outStream, object1)
                                         GetDetails(outStream, object2)
  outStream.write(object1.detail1)
                                           outStream.write(object2.detail1)
  outStream.write(object1.detail2)
                                           outStream.write(object2.detail2)
                                           outStream.flush()
  outStream.flush()
objectnotthreadsafe{
//可变态
私有变量currentPrefix=“”
def倒计时(前缀:字符串)={
//红旗:更改可变状态,然后引用它
currentPrefix=前缀

对于(i),只要输入不同(并且没有连接到下面的同一个流),您就可以了。只要输入不同(并且没有连接到下面的同一个流),您就可以了。感谢您的响应。是否要删除流并让函数返回列表[字符串]保证线程安全?@AnIllusion如果你的
getDetails
方法不影响它自己的本地VAL/VAR之外的任何状态,那么是的。如果你所做的只是建立一个
列表
以返回,那么是的,因为你不影响任何其他状态。谢谢你的响应。你会摆脱流并拥有这个函数吗返回列表[String]保证线程安全?@AnIllusion如果您的
getDetails
方法不影响其自身本地VAL/VAR之外的任何状态,则返回是。如果您所做的只是构建要返回的
列表,则返回是,因为您不影响任何其他状态。