Я работаю над своей первой многопоточной программой и застрял в нескольких аспектах синхронизации. Я просмотрел учебник по многопоточности на домашней странице oracle / sun, а также несколько вопросов здесь, на SO, поэтому я думаю, что у меня есть представление о том, что такое синхронизация. Однако, как я уже упоминал, есть пара аспектов, которые я не совсем уверен, как это выяснить. Я сформулировал их ниже в форме четкого вопроса:
Вопрос 1: У меня есть одноэлементный класс, который содержит методы для проверки допустимых идентификаторов. Оказывается, этот класс необходимо хранить в коллекциях, чтобы отслеживать ассоциации между двумя различными типами идентификаторов. (Если идентификатор слова звучит сложно; это просто строки). Я решил реализовать два MultiValueMap
экземпляров для реализации этого отношения «многие ко многим». Я не уверен, что эти коллекции должны быть потокобезопасными, поскольку коллекция будет обновляться только при создании экземпляра класса singleton, но тем не менее я заметил, что в документации написано:
Обратите внимание, что MultiValueMap не синхронизируется и не является поточно-ориентированным. Если вы хотите использовать эту карту из нескольких потоков одновременно, вы должны использовать соответствующую синхронизацию. Этот класс может выдавать исключения при доступе к параллельным потокам без синхронизации.
Может ли кто-нибудь уточнить эту "надлежащую синхронизацию"? Что именно это значит? Я не могу использовать MultiValueMap.decorate()
на синхронизированном HashMap
, или я что-то неправильно понял?
Вопрос 2: У меня есть другой класс, который расширяет HashMap
для хранения моих экспериментальных значений, которые анализируются при запуске программного обеспечения. Этот класс предназначен для предоставления соответствующих методов для моего анализа, таких как permutation()
, randomization()
, filtering(criteria)
и т. Д. Поскольку я хочу максимально защитить свои данные, класс создается и обновляется один раз , и все вышеперечисленные методы возвращают новые коллекции. Опять же, я не уверен, что этот класс должен быть потокобезопасным, так как он не должен обновляться из нескольких потоков, но методы, скорее всего, будут вызываться из нескольких потоков, и чтобы он был «безопасным», я добавил synchronized
модификатор для всех моих методов. Можете ли вы предвидеть какие-либо проблемы с этим? О каких потенциальных проблемах я должен знать?
Спасибо