mais uma duvida sobre synchronized.
quando o synchronized é aplicado sobre um metodo static, quem ou o que vai ser bloqueado ?
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
valeu mesmo
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 : )