powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Использование value based классов в качестве объекта синхронизации
6 сообщений из 6, страница 1 из 1
Использование value based классов в качестве объекта синхронизации
    #39936242
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В описании класса Class Optional<T> сказано:
Код: java
1.
This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.



В 25 пункте туторала 26 Reasons Why Using Optional Correctly Is Not Optional приведен код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
// NEVER DO

Optional<Product> product = Optional.of(new Product());

synchronized(product) {

    ...

}



Несколько вопросов:

1). Почему операция == для объектов класса Optional может привести к непредсказуемым результатам? С equals и hashcode понятно, их можно переопределить по хранящемуся значению в них, но ссылки то на объекты в моем понимании фиксированные.

2). Отсюда второй вопрос, почему мы не можем использовать объекты класса Optional в качестве объекта синхронизации? На сколько я знаю у каждого объекта или класса есть свой монитор (возможно скрытое поле или какой то другой механизм, точно не знаю), и он однозначно привязан к этому объекту или классу.

так если посмотреть на код:
Код: java
1.
2.
3.
4.
5.
		Optional<String> op1 = Optional.of("abc");
		Optional<String> op2 = Optional.of("abc");
		
		System.out.println(op1 == op2);
		System.out.println(op1.equals(op2));


первое сравнение всегда будет возвращать false ? А второе зависит от хранимых в объектах op1 и op2 значений ?
...
Рейтинг: 0 / 0
Использование value based классов в качестве объекта синхронизации
    #39936248
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня единственная догадка, что это как то связано с оптимизацией кода, возможно при компиляции может произойти замена одного объекта на другой, если компилятор посчитает их одинаковыми.
...
Рейтинг: 0 / 0
Использование value based классов в качестве объекта синхронизации
    #39936287
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
У меня единственная догадка, что это как то связано с оптимизацией кода, возможно при компиляции может произойти замена одного объекта на другой, если компилятор посчитает их одинаковыми.


имхо, больше это связано с общей логикой.
1) == как операция не применима к значениям, и значит, не должна применяться к value type
Не имеет значения результат операции, смысл которой не определен для данного случая.
аналогично
2) - синхронизироваться имеет смысл только на изменяемых объектах

В обоих случаях компилятору было бы хорошо выдавать ошибки времени компиляции о недопустимом использовании операции.
Но пока пользуйтесь правилом большого пальца.
...
Рейтинг: 0 / 0
Использование value based классов в качестве объекта синхронизации
    #39936420
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на первый вопрос я думаю ответ простой
это два разных объекта,почему у них должны быть одинаковые ссылки
если ты сделаешь вот так
Код: java
1.
2.
3.
Optional<String> o1=Optional.of("adc");
        Optional<String> o2;
        o2=o1;


ссылки будут раны
а когда ты делаешь
Код: java
1.
2.
Optional<String> o1=Optional.of("adc");
Optional<String> o2=Optional.of("adc");


это два разных объекта,хотя их содержимое эквивалентно

тоже самое ты получишь и тут
Код: java
1.
2.
3.
String s=new String("abc");
        String s1=new String("abc");
        System.out.println(s1==s);



FALSE
...
Рейтинг: 0 / 0
Использование value based классов в качестве объекта синхронизации
    #39937357
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
почему мы не можем использовать объекты класса Optional в качестве объекта синхронизации?


1. java.util.Optional#ofNullable может вернуть синглетон java.util.Optional#EMPTY, т.е. мы можем в коде, сами того не осознавая, получить кучу одинаковых мониторов
2. java.util.Optional immutable, в нем менять нечего, смысла в мониторе нет
...
Рейтинг: 0 / 0
Использование value based классов в качестве объекта синхронизации
    #39937371
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen, Optional - это тип-обёртка. И тебе надо синхронизироваться не с обёрткой а с содержанием.
Так будет правильно.

Кроме того назначение Optional - это быть типом-контейнером. Переносить другие объекты.
И если внутри Optional лежит константа EMPTY - тогда вся логика синхронизации ломается
и ломается полиморфизм. Уже нельзя синхронизироваться без условия. Это осложняет
смысл.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Использование value based классов в качестве объекта синхронизации
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]