Можете ли вы использовать объект, который синхронизирован как блокировка

Является ли этот код нормально, или мне нужно создать отдельный объект блокировки? Я спрашиваю, есть ли потенциал для какого-то тупика или что-то в этом роде. Я предполагаю, что он должен работать, поскольку язык позволяет это, но, чтобы быть уверенным, что я лучше пойму, как это работает, и почему это нормально или почему это не нормально.

var foo = false fun bar() { synchronized(foo) { foo = !foo } } 

    Ваш код нарушен таким образом, которого вы не ожидаете. Вот упрощенная версия байт-кода, который он генерирует, декомпилируется на Java:

     private static boolean foo; public static final void bar() { Boolean var0 = Boolean.valueOf(foo); synchronized(var0) { foo = !foo; } } 

    Таким образом, вы по существу блокируете любой объект, возвращаемый функцией valueOf , который в моей JRE является либо TRUE либо FALSE внутри Boolean класса (это также упрощено):

     public class Boolean { public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); public static Boolean valueOf(boolean var0) { return var0 ? TRUE : FALSE; } } 

    Ваш лучший выбор для определенного, независимого от исполнения времени кода, вероятно, для создания отдельного экземпляра Any для синхронизации.

    Intereting Posts
    Firebase UI для хранения с Kotlin дает ошибку Простой способ узнать, является ли класс анонимным / объектом и получить конкретное имя класса из экземпляра в Котлине Просмотр не обновляется после первого запуска LiveData при использовании фоновой работы в Android Наследовать от абстрактного класса с умножением варов в Котлине Как запросить Realm в фоновом потоке с помощью RxJava2 "Convert" Просмотреть класс для аннотации андроида Режиссер радиопередач в Котлине Android – ViewDataBinding.inflate не раздувает вложенное пользовательское представление Kotlin: как передать массив в аннотацию Java Порядок настройки Планировщики в Rx Ожидается ли, что я могу вызвать функцию с объектом-приемником, передав объект-приемник в качестве первого аргумента? Можно ли аннотировать конструктор классов в Котлине Итерировать значения перечисления, используя значения () и valueOf в kotlin Как сохранить логотип над рушащейся панелью инструментов Чистая архитектура Android: проблема с репозиторием