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之外的任何状态,则返回是。如果您所做的只是构建要返回的列表,则返回是,因为您不影响任何其他状态。