Questão de Blocos Sincronizados estáticos e não estáticos

4 respostas
B

Pessoal , estou com uma dúvida na questão 15 do capítulo 9(pág 424) do livro da kathy.

O trecho de código é este :

public class ThreadDemo {

synchronized void a() { actBusy(); }
static synchronized void b() { actBusy(); }
static void actBusy(){
try
{
  Thread.sleep(1000);
} catch (InterruptedException e) {}
}

public static void main(String args[])
{
 
final ThreadDemo x = new ThreadDemo();
final ThreadDemo y = new ThreadDemo();

Runnable runnable = new Runnable()
{
 public void run()
 {
  int option = (int) (Math.random() * 4);
   switch(option)
   {
    case 0: x.a(); break;
    case 1: x.b(); break;
    case 2: y.a(); break;
    case 3: y.b(); break;
   }
 }
};

Thread thread1 = new Thread (runnable);
Thread thread2 = new Thread (runnable);
thread1.start();
thread2.start();
}

}

x.a() em thread1 e x.b() em thread2 pode acontecer.
x.a() em thread1 e y.b() em thread2 pode acontecer.
x.b() em thread1 e x.a() em thread2 pode acontecer.
x.b() em thread1 e y.b() em thread2 pode acontecer.

Porque essas opções estão corretas se os métodos estáticos bloqueiam a classe ? (Entendo que se bloqueia a classe , nenhuma instância conseguirá acesso …) Não entendi esta questão …

4 Respostas

F

Correto os métodos estáticos bloqueiam a classe mas não a instância.
No teu exemplo os métodos estáticos iram bloquear em ThreadDemo.class enquanto que métodos sincronizados não estáticos bloqueia na instância do objeto no caso this.

Threads são úteis qd estamos rodando processos em cima da mesma instância de um objeto.

B

Tdo bem , mas vc poderia explicar em cima das opções ? Esta, por exemplo :

x.b() em thread1 e y.b() em thread2 pode acontecer.

Não deu pra entender , pois um thread vai acessar um método estático e o outro também, sendo que eles bloqueiam a mesma classe (Thread.class)… Como isso pode acontecer ?

F

Essa questão é para confundir.
a bloqueia this e b bloqueia ThreadDemo.getClass() que são objetos diferentes. Por isso, 1, 2 e 3 corretas. Nota: Métodos estáticos podem ser chamados sem ter uma instância do objeto, portanto x.b() ou y.b() é igual a ThreadDemo.b().
Quanto a 4 por serem o mesmo método, um será executado depois do outro pois o primeiro irá objeter o bloqueio em ThreadDemo.getClass(). Os demais iram executar de forma simultânea pq estão obtendo bloqueios em objetos diferentes.

B

Agora entendi. Postei isto errado galera, foi mal :

Tdo bem , mas vc poderia explicar em cima das opções ? Esta, por exemplo : 

x.b() em thread1 e y.b() em thread2 pode acontecer. 

Não deu pra entender , pois um thread vai acessar um método estático e o outro também, sendo que eles bloqueiam a mesma classe (Thread.class)... Como isso pode acontecer ?

Na verdade, esta opção não pode acontecer.

Criado 4 de janeiro de 2008
Ultima resposta 7 de jan. de 2008
Respostas 4
Participantes 2