Сколько времени занимает строковый вопрос ...
Метод будет поточно-ориентированным, если он использует ключевое слово synchronized в своем объявлении.
Однако, даже если ваши методы setId и getId использовали синхронизированное ключевое слово, ваш процесс установки идентификатора (если он не был предварительно инициализирован) выше не является. ... но даже тогда есть вопрос "это зависит" от вопроса. Если невозможно для двух потоков когда-либо получить один и тот же объект с неинициализированным идентификатором, тогда вы безопасны для потока, потому что вы никогда не попытаетесь одновременно изменить идентификатор.
Вполне возможно, учитывая код в вашем вопросе, что для одного и того же объекта может быть два вызова в потокобезопасный getid одновременно. Один за другим они получают возвращаемое значение (ноль) и немедленно получают приоритет, чтобы запустить другой поток. Это означает, что оба затем будут запускать потокобезопасный метод setId - снова один за другим.
Вы можете объявить весь метод сохранения как синхронизированный, но если вы сделаете это, весь метод будет однопоточным, что в первую очередь противоречит цели использования потоков. Вы стремитесь свести синхронизированный код к минимуму, чтобы максимизировать параллелизм.
Вы также можете поместить синхронизированный блок вокруг критического оператора if и минимизировать однопотоковую часть обработки, но тогда вам также нужно быть осторожным, если есть другие части кода, которые также могут установить Id, если он ранее не был инициализирован.
Другая возможность, которая имеет различные плюсы и минусы, состоит в том, чтобы поместить инициализацию Id в метод get и синхронизировать этот метод, или просто назначить Id при создании объекта в конструкторе.
Надеюсь, это поможет ...
Редактировать ...
Выше рассказывается об особенностях языка Java. Несколько человек упомянули средства в библиотеках классов Java (например, java.util.concurrent), которые также обеспечивают поддержку параллелизма. Так что это хорошее дополнение, но есть также целые пакеты, которые по-разному обращаются к параллелизму и другим парадигмам параллельного программирования (например, параллелизму).
Чтобы дополнить список, я бы добавил такие инструменты, как Akka и Кошачий эффект (параллелизм) и другие.
Не говоря уже о книгах и курсах, посвященных этой теме.
Я просто перечитал ваш вопрос и заметил, что вы спрашиваете о базах данных. Снова ответ, это зависит. Rdbms 'обычно позволяет вам выполнять операции такого типа с блокировками записей, как правило, в транзакции. Некоторые (например, teradata) используют специальные предложения, такие как locking row for write select * from some table where pi_cols = 'somevalues'
, который блокирует rowhash до тех пор, пока вы не обновите его или некоторые другие условия. Это известно как пессимистическая блокировка.
Другие (примечательно nosql) имеют оптимистическую блокировку. Это когда вы читаете запись (как вы подразумеваете с getid), нет возможности заблокировать запись. Затем вы делаете условное обновление. Условное обновление выглядит примерно так: write the id as x provided that when you try to do so the Id is still null (or whatever the value was when you checked)
. Эти типы операций обычно выполняются через API.
Вы также можете сделать оптимистическую блокировку в RDBM следующим образом:
SQL
Update tbl
Set x = 'some value',
Last_update_timestamp = current_timestamp()
Where x = bull AND last_update_timestamp = 'same value as when I last checked'
В этом примере вторая часть предложения where является критическим битом, который в основном говорит: «Обновляйте запись, только если никто не сделал и Я верю, что все остальные обновят последнее обновление до того момента, когда они это сделают». Бит «доверие» иногда можно заменить триггерами.
Эти типы операций с базой данных (если доступны) гарантируются ядром базы данных как «поточно-ориентированные».
Что возвращает меня к наблюдению "как долго это кусок нити" в начале этого ответа ...