Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Использование value based классов в качестве объекта синхронизации  [new]
faustgreen
Member

Откуда:
Сообщений: 377
В описании класса Class Optional<T> сказано:
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 приведен код:
// NEVER DO

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

synchronized(product) {

    ...

}


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

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

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

так если посмотреть на код:
		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 значений ?
11 мар 20, 12:17    [22096739]     Ответить | Цитировать Сообщить модератору
 Re: Использование value based классов в качестве объекта синхронизации  [new]
faustgreen
Member

Откуда:
Сообщений: 377
У меня единственная догадка, что это как то связано с оптимизацией кода, возможно при компиляции может произойти замена одного объекта на другой, если компилятор посчитает их одинаковыми.
11 мар 20, 12:30    [22096763]     Ответить | Цитировать Сообщить модератору
 Re: Использование value based классов в качестве объекта синхронизации  [new]
booby
Member

Откуда:
Сообщений: 1858
faustgreen
У меня единственная догадка, что это как то связано с оптимизацией кода, возможно при компиляции может произойти замена одного объекта на другой, если компилятор посчитает их одинаковыми.


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

В обоих случаях компилятору было бы хорошо выдавать ошибки времени компиляции о недопустимом использовании операции.
Но пока пользуйтесь правилом большого пальца.
11 мар 20, 14:47    [22096898]     Ответить | Цитировать Сообщить модератору
 Re: Использование value based классов в качестве объекта синхронизации  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2991
на первый вопрос я думаю ответ простой
это два разных объекта,почему у них должны быть одинаковые ссылки
если ты сделаешь вот так
Optional<String> o1=Optional.of("adc");
        Optional<String> o2;
        o2=o1;

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

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

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


FALSE
11 мар 20, 19:58    [22097161]     Ответить | Цитировать Сообщить модератору
 Re: Использование value based классов в качестве объекта синхронизации  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3531
faustgreen
почему мы не можем использовать объекты класса Optional в качестве объекта синхронизации?


1. java.util.Optional#ofNullable может вернуть синглетон java.util.Optional#EMPTY, т.е. мы можем в коде, сами того не осознавая, получить кучу одинаковых мониторов
2. java.util.Optional immutable, в нем менять нечего, смысла в мониторе нет
14 мар 20, 09:26    [22098976]     Ответить | Цитировать Сообщить модератору
 Re: Использование value based классов в качестве объекта синхронизации  [new]
mayton
Member

Откуда: loopback
Сообщений: 45514
faustgreen, Optional - это тип-обёртка. И тебе надо синхронизироваться не с обёрткой а с содержанием.
Так будет правильно.

Кроме того назначение Optional - это быть типом-контейнером. Переносить другие объекты.
И если внутри Optional лежит константа EMPTY - тогда вся логика синхронизации ломается
и ломается полиморфизм. Уже нельзя синхронизироваться без условия. Это осложняет
смысл.

Сообщение было отредактировано: 14 мар 20, 12:00
14 мар 20, 12:00    [22099010]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить