Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
а разве есть какойто смысл использовать ConcurrentHashMap в синхронизированном контексте или другими словами ConcurrentHashMap уже thread safe и нет смысла его синкать еще раз 🙂
от рэйс кондишнов "thread safe" структуры не спасают - у тебя ведь здесь два доступа. хотя в данном контексте максимум что произойдет, это два одинаковых стейтмента будут prepare'd ренундантно - но в мапе в конце все равно будет только один элемент.
и да, и нет. да - потому что желаемый эффект. нет - потому что залочит мап пока prepare будет исполнятся. в коде сверху, мап незалочен пока prepare исполняется. если препаре тормозной (как он типично в базах) то это очень сильно нежелаемый эффект.
Исходники у этого метода, канеш, вырви глаз, но мапа полностью не лочится. Здесь как и везде в конкаррент мапе есть а ля бакеты, которые вычисляются для каждой строки cql. То есть в случае коллизий будет лочиться только один бакет.
Session - это из cassandra driver. В доках по кассандре как раз рекомендуется использовать один объект сессии на все приложение. Так что он потокобезопасен.
Нет.
с ConcurrentSkipListMap перепутал
PS
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#computeIfAbsent-K-java.util.function.Function-
но как здесь описывается, то вроде бы чтение из мапа не будет заблокировано - только запись в мап. не совсем желательно - но часто это достаточно.
Исходники у этого метода, канеш, вырви глаз, но мапа полностью не лочится. Здесь как и везде в конкаррент мапе есть а ля бакеты, которые вычисляются для каждой строки cql. То есть в случае коллизий будет лочиться только один бакет.
Шо это за слово такое? 🙂
А кто сказал, что session.prepare(cql); потокобезопасен?
Тут смех скорее не в блокировках, а в том, как происходит инвалидация кэша.
Что происходит с PreparedStatement, когда сессия закрывается?
Кто удаляет старые записи из кэша?
"Java uses garbage collection, thus there are no memory leak by design. You simply need to install more RAM on your servers."
Что-то я и сам затупил. Лок тут используется не для того, чтобы защитить session, и не для того, чтобы защитить мапу.
Он тут используется для того, чтобы не подготавливать один и тот же запрос дважды.
Осталось проверить, является ли session потокобезопасным.
Сессия закрывается при остановке приложения. То есть все время жизни приложения PreparedStatement абсолютно валиден.
Наконец-то за сайт взялись
а меня пронесло?