#java #multithreading #synchronization
#java #многопоточность #синхронизация
Вопрос:
Я хочу синхронизировать блок кода на основе строки, чтобы разные потоки с одинаковым строковым значением блокировались и выполнялись один за другим. Но разные потоки с разными строковыми значениями могут одновременно выполнять синхронизированный блок. Но, как всегда, когда я читал, я узнал, что синхронизация по строке не является хорошей практикой. Итак, что я сделал, я создал один класс Java только с одним свойством и использовал этот объект для синхронизации, как показано ниже. Но у меня не получилось. Это не блокирует выполнение синхронизированного блока, когда одни и те же объекты поступают одновременно…Может ли кто-нибудь предложить решение для этого?
SampleDTO sampleDTO = new SampleDTO();
sampleDTO.setClmNumber("someDynamicString");
synchronized (sampleDTO) {
}
Я также внедрил equals и метод hashCode внутри SampleDTO .
Комментарии:
1. Нужно увидеть больше кода. Я замечаю, что
sampleDTO
это не является окончательным, поэтому, если он когда-либо будет заменен другим объектом, ваша синхронизация будет завершена.2. Даже после изменения SampleDTO на final он допускает одновременное использование нескольких потоков с одинаковыми объектами внутри синхронизированного блока. Но если я установлю синхронизацию на sampleDTO.getClmNumber().interen(), тогда синхронизация будет работать, но это не очень хорошая практика.
3. Разные потоки с одинаковым строковым значением должны содержать ссылки на объекты, указывающие на один и тот же объект. если потоки содержат разные объекты, они не будут синхронизированы, даже если строковые значения разных объектов одинаковы.
4. Я объявил SampleDTO с частным статическим финалом, в этом случае синхронизация происходит для всех потоков, она блокирует выполнение, даже если значение объекта имеет другое значение. Мне нужна синхронизация по значению объекта.