Synchronized

Sabemos que os construtores não podem ser declarados como synchronized porque dois threads que chamam o construtor da classe estão operando sobre dois objetos distintos, portanto o código abaixo:



class Base {

static int contador;

synchronized Base() {

contador++;

}

}



gera um erro de compilação.



No entanto, o código abaixo compila normalmente:



class Base {

static int contador;

Base() {

synchronized(this) {

contador++;

}

}

}



Agora pergunto, não deveria dar o mesmo erro? As declarações:



synchronized modificador retorno metodo(parametros) {

}



e



modificador retorno metodo(parametros) {

synchronized(objeto) {

}

}



não são equivalentes?

Em um artigo da developerWorks eu li o seguinte:

"One final note about the synchronized keyword. The Java language does not allow constructors to be declared synchronized . (A compiler error is generated if the synchronized keyword is present on a constructor declaration.) This is because two threads that call the same constructor concurrently operate on two distinct pieces of memory for two distinct instances of the same class. However, if these constructors contain code that contends for a mutually shared resource, you must synchronize on that resource in order to avoid conflicts."



No meu entendimento, o que acontece o seguinte: o que você sincroniza são os objetos, não métodos. Está escrito no mesmo artigo:

"When synchronized is used as a method modifier, the lock obtained is that for the object on which the method was invoked.When it is used on an object reference, the lock obtained is that for the object referred to".



Sendo assim, quando você está utilizando um construtor você não tem realmente um objeto ainda, e não faz sentido sincronizar. A partir do momento que você já está dentro do construtor, o Java já realizou as operações básicas de criar o objeto, e dessa forma já tem onde aplicar o synchronized.

ok! obrigado!, você poderia por favor me passar o link deste artigo?

www.ibm.com/developerworks/java/?

http://www-106.ibm.com/developerworks/library/j-praxis/pr46.html