Questão sobre Threads

6 respostas
anderson.bonavides
public class ThreadDemo {
	synchronized void a(){
		actBusy();
	}
	static synchronized void b() {
		actBusy();
	}
	static void actBusy(){
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO: handle exception
		}
	}
	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.a(); break;
				}
			}
		};
		Thread thread1 = new Thread(runnable);
		Thread thread2 = new Thread(runnable);
		thread1.start();
		thread2.start();

	}

}
/*
[b]Quais dos seguintes pares de chmadas a métodos nunca poderiam ser executados ao mesmo tempo?[/b]

a) x.a() em thread1, e x.a() em thread2
b) x.a() em thread1, e x.b() em thread2
c) x.a() em thread1, e y.a() em thread2
d) x.a() em thread1, e y.b() em thread2
e) x.b() em thread1, e x.a() em thread2
f) x.b() em thread1, e x.b() em thread2
g) x.b() em thread1, e y.a() em thread2
h) x.b() em thread1, e y.b() em thread2

[i]RESPOSTA:[/i][u]
[b]A,F e H[/b]

*/

Galéra eu não entendi o resultado, será que pode ser possível uma explicação de alguêm que saiba ou que também está estudando?

Desde já agradeço.

6 Respostas

sergiolopes

Oi Anderson!

A pegadinha aqui é saber o que significa synchronized em um método de instância e synchronized em um método estático.

Em um método de instância é semelhante a synchronized(this) e num método estático ele locka o objeto Class que representa a classe, algo como synchronized(ThreadDemo.class).

Sabendo disso, conclui-se que chamadas ao método a() feitas na mesma instância não podem ser executadas em paralelo. E chamadas ao método b() (que é estático) feitas em objetos da mesma classe não podem ser feitas em paralelo (no caso tanto x quanto y são da mesma classe)

Por isso que não pode:

x.a() em thread1, e x.a() em thread2
x.b() em thread1, e x.b() em thread2
x.b() em thread1, e y.b() em thread2

E, não tem essa opção, mas tambem nao poderia:

y.a() em thread1, e y.a() em thread2

jvictorcf

Ola Sergio,

Me surgiu uma duvida, thread1 e thread2 nao sao instancias diferentes? Entao porque elas naum podem ser executadas em paralelo no metodo a() (que nao eh estatico)?

Valeu

KWill

jvictorcf:
Ola Sergio,

Me surgiu uma duvida, thread1 e thread2 nao sao instancias diferentes? Entao porque elas naum podem ser executadas em paralelo no metodo a() (que nao eh estatico)?

Valeu

jvictorcf, acho que você não percebeu que as Threads thread1 e thread1, apesar de serem instâncias diferentes, compartilham a mesma instância de uma classe anônima que implementa a interface Runnable. Assim, as Threads thread1 e thread2 ficam dependentes da sincronização existente.

Até onde sei, deve ser isso.

Inté.

anderson.bonavides

sergiousp Muito boa sua resposta… O problema desse livro em português é a falta de claridade na tradução. Muito obscuro, mas sem ele eu não estudaria…

:slight_smile:

Fico agradecido pela sua esplicação precisa… Espero assim passar no exame e ajudar aqueles que inicarem nos estudos para a certificação.

Te agradeço. t+ :smiley:

sergiolopes

Cuidado, a discussão é sobre as instâncias da classe ThreadDemo (no caso, x e y). O que temos são duas Threads em paralelo querendo chamar métodos nos objetos x e y, e isso não pode ser feito nas situacoes discutidas.

E, só pra comentar pra quem vai fazer a prova: nesse exercicio tem a ideia de classe anonima (ele cria uma que implementa Runnable). E, com classes anonimas locais (as declaradas dentro de metodos) só conseguimo acessar variaveis locais que sejam final. Por isso x e y estao marcadas como final.

anderson.bonavides
#   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.a(); break;  
#                 }  
#             }  
#         };

Você quer dizer que pelo fato da varivavel "x" está dentro da classe anônima refereinciando o metodo a() só estamos conseguindo fazer isso pelo fato de "x" ser final?

É isso?

Até onde eu sei marcar uma variável como final significa dizer que ela a varável não é modificavel...

Posso está enganado...

Criado 30 de agosto de 2007
Ultima resposta 30 de ago. de 2007
Respostas 6
Participantes 4