Котлин синхронизирован в инине - PullRequest
0 голосов
/ 31 октября 2018

Известно ли, что вы не можете синхронизировать встроенную функцию в Kotlin? Я не могу найти никакой документации по этому вопросу.

Представьте, что у вас есть класс с синхронизированным методом;

/**
 * Allows modifying the value in a synchronized way so that the get() and set() are atomic.
 *
 * Note: anything synchronized cannot be `inline`.
 */
@Synchronized fun safeSet(calculateNewValue: (T) -> T) {
    set(calculateNewValue(get()))
}

Когда эта функция inlined, этот тест не пройден, а если он не inlined, он проходит.

@Test
fun `safeSet - is synchronized`() {
    val insideSet = AtomicInteger()
    val threadsRun = CountDownLatch(2)
    val t1 = Thread({
        threadsRun.countDown()
        sut.safeSet { currentValue: Int ->
            insideSet.incrementAndGet()
            try {
                Thread.sleep(100000)
            } catch (interrupted: InterruptedException) {
                BoseLog.debug(interrupted)
            }
            currentValue + 1
        }
    })
    t1.start()

    val t2 = Thread({
        threadsRun.countDown()
        sut.safeSet { currentValue: Int ->
            insideSet.incrementAndGet()
            try {
                Thread.sleep(100000)
            } catch (interrupted: InterruptedException) {
                BoseLog.debug(interrupted)
            }
            currentValue + 2
        }
    })
    t2.start()

    threadsRun.await()
    Thread.sleep(100)
    assertEquals(1, insideSet.get())
    t1.interrupt()
    t2.interrupt()
    Thread.sleep(100)
    assertEquals(2, insideSet.get())
}

1 Ответ

0 голосов
/ 31 октября 2018

Аннотация @Synchronized указывает компилятору сгенерировать флаг ACC_SYNCHRONIZED для метода. Встроенные функции не компилируются в методы, поэтому аннотация действительно игнорируется.

В Котлине есть открытый выпуск для лучшей обработки этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...