并发在Kotlin

我有一个类,有一个可写的多个线程,类似的variables

class A { var s: String? = null //var accessed by multiple threads fun doStuff() { if (s != null) { //not safe } } } 

为了解决这个问题,我通常会像这样做一个不可变的副本

 class A { var s: String? = null //var accessed by multiple threads fun doStuff() { val sCopy = s if (sCopy != null) { //safe now } } } 

我阅读有关并发工具,如易失性,同步等,但我不擅长multithreading,但我不知道应该如何处理它,我敢肯定有更好的方法来实现这一点,而不是创造一个不可改变的价值,你会怎么做?

您需要将写入和读取锁定到您的variables,如下所示:

 class A { var s: String? = null //var accessed by multiple threads set(s) { synchronized(this) { field = s } } fun doStuff() { synchronized(this) { //safe now } } } 

你需要在setter中同步,否则当一个线程在doStuff中时该值可能被覆盖。

尽管通常最好避免multithreading可以写同一个variables的情况。

首先,这与Kotlin无关,因为您可以在这些情况下简单地重用Java工具。

它实际上总是取决于国家发生的事情(在你的特殊情况下)。 对于大多数简单的情况,您可以创建一个将用作的对象(可以是任何types),并使用该锁来访问您的状态。

 val lock = Any() synchronized(lock){ //safe now } 

最后但并非最不重要的是,你的代码val sCopy = s不是val sCopy = s的副本,它只是指向同一个对象的第二个variables; 这个代码没有任何安全性。