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?
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();
}
}
}
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;
}
}
}