在runOnUiThread线程中修改我的ArrayList安全吗?



我有一个保留 ArrayList 的活动。该活动将修改和访问 ArrayList,但我也想从其他线程访问它。

我正在使用runOnUiThread来完成此操作,但我不确定这是否线程安全,或者是否有更好的方法来执行此操作

class MainActivity : AppCompatActivity() {
var connectedSockets = ArrayList<Socket>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val port: Int
serverSocket = ServerSocket(0).also { socket ->
port = socket.localPort
}
Thread(Runnable {
while (serverSocket != null) {
serverSocket?.accept()?.let {
runOnUiThread {
connectedSockets.add(it)
}
}
}
}).start()
}
}

在这种情况下,connectedSockets 线程安全吗?有没有更明智的方法来做到这一点,或者我走在正确的轨道上?

除非您开始从两个不同的线程或任何其他非线程安全线程修改 List,否则它是安全的。对于这种情况,您必须只有一个线程,其中将修改某些内容。如果您从列表中获取某些内容并从同一线程中放置某些内容,则可以防止并发修改的情况。

由于多种原因,此代码不是线程安全的。

  1. connectedSockets是公共和可变的。您可以将其更改为:

    private val connectedSockets = ArrayList<Socket>()

  2. ArrayList本身不是线程安全的。Vector已被弃用。不过,您可以使用CopyOnWriteArrayList

    private val connectedSockets = CopyOnWriteArrayList<Socket>()

创建单独的线程并在线程中强制在 UI 任务中执行代码是没有意义的。事实上,您没有使用多线程

如果要在真正的独立线程中修改 ArrayList 并使其线程安全,请创建一个类似Object myObject = new Object();的实例,并将修改 ArrayList 的任何代码括在此synchronize(myObject) {/ ** code that alters the list ** /}

这样,一次只有一个任务可以修改列表

最新更新