Синхронизированный блок на объекте Java не работает

#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 с частным статическим финалом, в этом случае синхронизация происходит для всех потоков, она блокирует выполнение, даже если значение объекта имеет другое значение. Мне нужна синхронизация по значению объекта.