ae pessoal estudando threads… e vendo o modificador synchronized me bateu essa duvida, a qual eu tinha certeza que o codigo ia ser impresso era: JJ0 JJ 1 JJ 2. ou GG 0 GG 1 GG2. nao eh garantido qual seria primeiro mais a impressao seria dessa forma… ou um ou outro. porem nao foi… o q houve?
Porem o resultado nao foi assim pq? se na teoria synchronized diz que uma unica thread so pode executar um bloco ou metodo synchronized.
class bloq extends Thread{
public void run(){
bloqq();
}
public synchronized void bloqq(){
for(int i=0;i<3;i++){
System.out.println(Thread.currentThread().getName() + i);
try{
Thread.sleep(1000);
}catch(InterruptedException e){}
}}
public static void main(String args[]){
bloq b = new bloq();b.setName("JJ");
bloq b2 = new bloq();b2.setName("GG");
b.start();
b2.start();
}
}
porem esse codigo me deixou plenamente confuso… e sem entender…
Segundo a kathy o metodo sleep() ele nao libera o bloqueio de um metodo ou bloco sincronizado mais parece isso nao aconteceu ai… dar ideia que o bloqueio foi liberado… :S :?:
pq com o static vc vai estar fazendo lock na classe e não mais no objeto.
Dá uma olhada no livro da Kaith que tem uma parte falando sobre lock na classe e lock no objeto … eu achei muito interessante a explicação e os exemplos do livro.
Tem um explanação no livro sobre o acesso a atributos estáticos sendo acessados por métodos não estáticos …
po. eu li…mais ainda ta confuso de abstrair… pq achei que somente uma thread ia executar esse metodo… sendo ele nao static… mais pelo visto nao…
eita q ta confuso :S
Camilo, se você tem 2 objetos, você terá um bloco sincronizado para cada objeto. Em cada objeto, haverá uma cópia de variáveis locais, uma cópia de toda a estrutura. Portanto, cada thread terá liberdade de percorrer esse bloco da maneira que lhe convier.
A sincronização só faz sentido quando duas threads diferentes tentam acessar O MESMO objeto. Por exemplo, no código abaixo as duas threads bloq compartilham um único objeto, chamado bloqPrinter. Esse objeto, que vai ser acessado por duas threads ao mesmo tempo, tem um método sincronizado:
[code] class bloq extends Thread{
bloqPrinter printer;
public bloq(bloqPrinter p)
{
this.printer = p;
}
public void run(){
printer.bloqq();
}
public static void main(String args[]){
bloqPrinter p = new bloqPrinter();
bloq b = new bloq(p);
b.setName("JJ");
bloq b2 = new bloq(p);
b2.setName("GG");
b.start();
b2.start();
}
}[/code]
class bloqPrinter
{
public synchronized void bloqq(){
for(int i=0;i<3;i++){
System.out.println(Thread.currentThread().getName() + i);
try{
Thread.sleep(1000);
}catch(InterruptedException e){}
}}
}
po entao saquei… no meu codigo tenho destino diferentes para minhas duas threads? posso dizer assim? por isso que o metodo eh acessando pelas threads ao mesmo tempo e afetando o resultado? enfim nao tenho um metodo synchronized o qual nao faz diferença ja q minhas threads nao tem o mesmo trabalho a ser executado certo?
é isso ai kra
vc possui uma Thread pra cada objeto, como não há acesso simultaneo aos objetos tanto faz se eh synchronized ou não, por isso o resultado está intercalado.
agora te deixo uma pergunta o resultado será sempre o mesmo??
Dois objetos diferentes, dois blocos de código sincronizado (um para cada objeto). Cada thread pode percorrer um bloco sincronizado por vez.
Com 2 blocos e 1 thread em cada bloco, duas threads rodam juntas.
Um único objeto terá um bloco de sincronização. Cada thread pode percorrer um bloco sincronizado por vez. Com 1 blocos e 2 threads, uma terá que rodar de cada vez…
opa saquei! valeu galera… dei uma lida novamente e vi que a kathy fala sobre isso… em outras palavras hehe… neohacker a resposta é: não, nada é garantido