olá pessoal, estou estudando para a certificação com o livro da kathy, e o quesito Threads está me deichando com algumas dúvidas, por exemplo, sobre o bloco de código synchronized passando um objeto como o parâmetro, por exemplo, o cógio abaixo, pelo que explica o livro, explica que a Thread que está executando obtém o bloqueio de b, mas o que seria exatamente este bloqueio? seria nem uma outra Thread poder acessar este bloco?, mas no livro também fala que quando o objeto chama wait() ele perde o bloqueio, seria como o bloco syncronized não fizesse mais sentido, alguem poderia me esclarecer esta dúvida?
[code]public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();
b.start();
synchronized (b) {
System.out.println("esperando B terminar");
try {
b.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(b.total);
}
}
}
class ThreadB extends Thread {
int total;
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 30000000; i++) {
total += i;
}
notify();
}
}
}[/code]
o que exatamente acontece quando passo um objeto por parametro em um método synchronized? por exemplo se um objeto está fora do bloco synchronized, duas ou mais Threads podem fazer seu uso ao mesmo tempo, e se está dentro do bloco, só uma pode? ou apartir do momento que eu passo um objeto como parametro no synchronized ele bloqueia o objeto não impotando que eu tenha acesso a ele fora do bloco? como no exemplo abaixo, o que ocorre quando mais Threads acessam o objeto, 2 Threads podem acessar o valor fora do synchronized e só uma no bloco synchronized?
class Valor implements Runnable {
Integer valor = new Integer(0);
@Override
public void run() {
valor += 1;
synchronized (valor) {
valor -= 1;
}
}
}
[quote]mas no livro também fala que quando o objeto chama wait() ele perde o bloqueio, seria como o bloco syncronized não fizesse mais sentido, alguem poderia me esclarecer esta dúvida?
[/quote]
Bom, no livro existe o exemplo do wait(), sendo que uma thread “precisa” de dados para fazer seu trabalho, e a mesma “espera” que outro Thread forneça esses “Dados”, no caso do livro ele da o exemplo de “Machine” e “Operador”, enquanto a máquina espera os dados ela pode ser acionada por outro Thread certo?
O bloco sincronizado garante a “atomicidade” (considere que a física aqui está um pocuo desatualizada)" das operações, e se você decidiu “esperar” é porque realmente depende de outros “fatores” para continuar seu trabalho, e se está em um ambiente multi segmento, você quer que varías tarefas sejam realizadas ao “mesmo tempo”, sendo assim veja o exemplo da página 424 e 425, onde ele usa um exemplo de wait dentro de um loop, neste exemplo toda vez que ele sai do estado wait(), tem um while(jobs.isEmpty), verificando se esiste “trabalho” para aquela Thread, sendo assim não importa qual a Thread que estiver entrado no bloco sincronizado, se houver trabalho ela vai processar! No caso do exemplo a máquina só obterá as instruções se houver jobs!
Na segunda questão, o livro diz que bloqueio se diz a “instância” do mesmo objeto, se você sincronizou naquele objeto, o bloqueio é para aquela “instância”, não importa de onde está passando a “instância” ou melhor “a referência” para áquela instância, ora referência é referência certo, se o objeto estiver fora de um contexto sincronizado será usado normalmente… se estiver dentro de um contexto sincronizado, vai estar sendo “manipulado” pela thread corrente que está no
método sincronizado, no seu exemplo primeiramene voce esta dentro do métod run() fora de um bloco sincronizado, sendo assim se 10 threads acessar o metodo run vão somar 1 naquele objeto certo, quando entra no bloco sincronizado, nenhuma Thread vai poder acessar aquele ojbeto, por que você está com o bloqueio, após o término do bloco outras Threads terão acesso ao objeto…