как написать геттер и сеттер, содержащие mutex.withLock в kotlin - PullRequest
0 голосов
/ 16 июня 2020

Я хотел бы иметь синхронизированный доступ к переменной, представляющей мое состояние, из сопрограмм. Как я могу это исправить?

private var myState: MyState? = null
    get() = mutex.withLock {
        return@withLock myState
    }
    set(value) = mutex.withLock {
        field = value
    }
private val mutex = Mutex()    

сейчас я получаю сообщение Suspend function 'withLock' should be called only from a coroutine or another suspend function. Если невозможно, какие альтернативные элегантные решения?

1 Ответ

0 голосов
/ 16 июня 2020

Для вызова функции приостановки в не приостанавливающем контексте. Вы можете использовать runBlocking.

private var myState: MyState? = null
    get() {
        return runBlocking {
            mutex.withLock {
                myState
            }
        }
    }
    set(value) {
        runBlocking {
            mutex.withLock {
                field = value
            }
        }
    }
private val mutex = Mutex()    

ПРИМЕЧАНИЯ:

Возможно, вам лучше изменить свойство на две функции приостановки (getter / setter) вместо использования runBlocking. Все зависит от контекста, в котором вы звоните myState.

Вы также хотите рассмотреть возможность голосования за KT-15555 .

...