Synchronized em metodos static

mais uma duvida sobre synchronized.

quando o synchronized é aplicado sobre um metodo static, quem ou o que vai ser bloqueado ?

Olá,

A própria classe!

public static void meuMetodo() { synchronized(MinhaClasse.class) { //bloco sincronizado } }

é o mesmo que

public static synchronized void meuMetodo(){ } 

conseguiu entender?

Só complementando.

A palavra sinchronized serve para bloquear Threads, não objetos.

O objeto que está entre parenteses pode ou não ser o mesmo da classe. O que acontece é que sempre que uma thread tenta entrar num bloco sincronizado, ela “pega” aquele objeto para si e, enquanto ela o tiver, nenhuma outra thread pode passar por lá.

Você pode até ter um objeto diferente para sua classe, por exemplo:

[code]public class MinhaClasse {
private int[] lock = new int[0]; //Um objeto qualquer

public void metodoSincronizado() {
synchronized (lock) {
//Código sincronizado
lock.wait(100);
}

public void acordar() {
synchronized (lock) {
lock.notify();
}
}[/code]

Quem está sincronizado aí em cima? Os blocos de código de MinhaClasse. Quem é o objeto que é usado pela thread para tornar a sincronização possível? lock.

vini, eu tenho mais uma duvida, no caso o metodo synchronized sempre vai precisar de um objeto pra trava-lo ou eu posso simplesmente gerar um metodo normal e declara-lo como synchronized q o java reconhece q apenas uma thread pode acessa-lo por vez?

no caso um metodo como esse :

    public static synchronized void addContato(){
        Contato.add(new Contato());
    }

apenas uma thread acessaria por vez, ou eu teria que criar um objeto de lock??

Sempre precisa de um objeto para trava-lo.

Quando você declara um método como synchronized o objeto usado é o this.

Ou seja:

public synchronized void meuMetodo() { //Faz alguma coisa }

Equivale a:

public void meuMetodo() { synchronized (this) { //Faz alguma coisa } }

entendi, entao ele cria um lock default ,que seria o proprio metodo neh?
entao nao ha a nescessidade de se criar um lock manualmente , estou certo?
ou entendi tudo errado? :oops:

Isso mesmo.

Mas o lock default não é o próprio método, e sim, o próprio objeto.

brigadao vini :smiley:
valeu mesmo :smiley:

só pra ver se eu entendi … então se uma thread chamar um método estático de uma classe A, nenhuma outra thread poderá chamar métodos dessa classe A ?

Outras threads não poderão chamar nenhum outro método static e synchronized da mesma classe. Mesmo que essas threads estejam percorrendo objetos diferentes.

public class Classe { public static synchronized void metodo() { //Faz alguma coisa } }

Equivale a:

public class Classe { public static void metodo() { synchronized (Classe.class) { //Faz alguma coisa } } }

Note que Classe.class retornará a mesma coisa, para qualquer instância de objeto que venha a solicitar o uso do método.

entendi. valeu pelas explicacoes : )