У меня есть ситуация, и мне нужен совет о блоке synchronized
на Java. У меня есть тестовый класс ниже:Как работает синхронизированный блок в Java? Переменная ссылка или память заблокированы?
Class Test{
private A a;
public void doSomething1(String input){
synchronized (a) {
result = a.process(input);
}
}
public void doSomething2(String input){
synchronized (a) {
result = a.process(input);
}
}
public void doSomething3(String input){
result = a.process(input);
}
}
То, что я хочу, когда мульти потока вызывают методы doSomeThing1()
или doSomeThing2()
, объект «а» будет использоваться и разделяемые между несколькими потоками (это должно быть) и обрабатывает только один ввод в то время (ожидая, пока другие потоки установят объект «a» бесплатно), и когда вызывается doSomeThing3
, вход обрабатывается немедленно.
Мой вопрос будет касаться метода doSomeThing3()
моего метода doSomeThing1()
и doSomeThing2()
? Нужно ли ждать, если doSomeThing1()
и doSomeThing2()
используют объект "a"?
Все методы используют одно и то же соединение в боковом объекте 'a'. DoSomething1() и doSomething2() отвечают за обработку какой-либо транзакции, которая не может быть выполнена в многопоточной среде, поэтому они (отдельные) не могут быть выполнены одновременно с тем же запросом. Если doSomething1() использует объект a, другие doSomething1() должны ждать (приведет к отключению блокировки или занятости). DoSomething3() предназначен для других типов данных. Еще одна вещь, на которую вы могли бы помочь мне ответить - будет doSomething2() работать параллельно с doSomething1()? –
Синхронизированные части doSomething1() и doSomething2() не будут работать параллельно. –
@LinhNguyen Целесообразно использовать несколько выделенных объектов блокировки для независимых операций. Таким образом, эти независимые операции могут выполняться параллельно, а также намерение лучше документировано. Конечно, эти независимые операции не должны передавать изменчивые данные. –