#java #многопоточность #java_ee #jvm
К примеру у меня есть какой-то объект типа Object многопоточное чтение которого происходит
гораздо чаще, чем модификация и есть два варианта реализации:
a) обычная переменная Object obj и ReadWriteLock соответственно на методы чтения
и модификации
б) volatile Object obj, на метод модификации - простой Lock, создание нового объекта
и замены ссылки obj. Метод чтения без синхронизации(не считая записи-чтения volatile
переменной)
Какой из вариантов предпочтительнее и будет работать быстрее и почему?
Если я решил делать вариант 1.б и точно знаю, что мое приложение будет запускаться
на сервере с несколькими процессорами архитектуры x86-64, то мог ли я вообще убрать
volatile и нарушив тем самым JMM, но полагаясь на протоколы когерентности кешей процессоров?
прочитает ли ядро 2-го процессора измененные данные в ядре первого и даст ли это хоть
какой-то прирост производительности?
Ответы
Ответ 1
Интересный вопрос. Попробую ответить, хотя не претендую на правильность. Буду рад замечанием в комментариях. 1) Какой вариант будет быстрее? Сказать трудно, потому что все сильно зависит от usecas'а который вы используете. А именно, от количества писателей и читателей, частоты записи и чтения, потребность в "честной" синхронизации или ее критичности и пр. В общем, нужно замерять и писать тесты. Написал для этого вот такой код : Для варианта с Lock: private Object object = new Object(); private final ReentrantLock lock = new ReentrantLock(); Supplier
Комментариев нет:
Отправить комментарий