Eu tenho uma chamada de método programado que na hora programada chama o seguinte método:
private void doSomething(Map<String, String> someArguments) throws CustomException {
MyEnum runType = getRunType(someArguments);
switch (runType) {
case FRUIT:
new FruitClass().workNow();
break;
case VEGETABLE:
new VegetableClass().workNow();
break;
default:
// log that the type is not known
}
}
A assinatura do método de workNow
é como:
workNow() throws CustomException
workNow
método é executado por vários minutos e faz algum trabalho. Meu problema é, quando um workNow
de FRUIT
(ou VEGETABLE
) está acontecendo e outra invocação acontece com mesmo tipo ( FRUIT
por exemplo), ele cria uma nova FruitClass
instância e começa a executar a sua workNow
paralelamente.
Como faço para controlar este comportamento? Quero que a segunda chamada através do segundo objeto que esperar até o primeiro workNow
através primeiro objeto não está completa.
Esclarecer:
Invocação paralelo de
FRUIT
eVEGETABLE
está bem. Eu quero controlar invocação paralela do mesmo tipo. Dois ou maisFRUIT
ou dois ou maisVEGETABLE
.Eu não posso fazer
FruitClass
eVegetableClass
como singletons. Eu preciso de algum código envolvendo em tornonew
ao trabalho como eu quero.
Fazer a sincronização em um objeto de classe, e isso vai ser suficiente para evitar a criação de uma outra classe até acabado:
private void doSomething(Map<String, String> someArguments) {
MyEnum runType = getRunType(someArguments);
switch (runType) {
case FRUIT:
synchronized (FruitClass.class){
new FruitClass().workNow();
}
break;
case VEGETABLE:
synchronized (VegetableClass.class){
new VegetableClass().workNow();
}
break;
default:
// log that the type is not known
}
}
synchronized
em objeto de classe usa a instância de classe como um monitor. Classe de objectos é, na verdade, um Singleton (o objecto que representa o metadados classe em tempo de execução), e somente um segmento pode ser neste bloco.