kotlin中的并发性也是一个又一个同步块



我在kotlin中有一段这样的代码。

synchronized(this) {
// do some work and produces a String
}.also { /*it: String*/
logger.log(it)
}

可以一些线程来计时失误,变量在日志记录发生之前被更改?(有很多线程并发地执行这段代码)

展开注释:

  1. synchronized块返回一个作为it传递到also块的引用;是线程的本地引用,因此它不可能受到其他线程的影响。

  2. 一般来说,不能保证对象的引用指向:如果其他线程有对它的引用,它们可能会改变它的状态(或它引用的其他对象的状态)。

    但在这种情况下,它是String;在Kotlin中,String是完全不可变的.所以在这里没有这种风险。

把这些放在一起:在OP的代码中登录确实是线程安全的!

然而:

  1. 我们无法判断synchronized块中是否存在竞争条件或其他并发问题在之前创建并返回String。它在this上同步,这可以防止两个线程同时在同一个对象上执行它;但是如果有两个类的实例,每个实例都可以有一个线程运行它。

    例如,如果块使用一些不完全线程安全的公共对象,或者在两个实例中设置为相同引用的实例属性,或者以更迂回的方式共享,可能会出现问题。显然,这取决于工作的性质在那块,哪些对象访问,它。所以这也值得记住。