1º se eu sinchronizo 1 array… todos os seus objetos estão cincronizado?
public class Test {
private Date[] dates = new Date[4];
public Teste() {
for (int i = 0; i < dates.lenght; i++) dates[i] = new Date();
}
public doDatesMethod() {
synchronized(dates) {
//queria saber se alguem pode mexer dentro dos objetos da array
//enquanto isto está sincronizado...
//exemplo date[1] ???
//pq alguem pode ter este objeto guardado em outro field...
}
}
}
segunda dúvida… eu posso usar um sinchronizmo assim??
//pensando no mesmo código de cima...
public doNewDatesMethod() {
synchronized(dates) {
this.doDatesMethod();
//note q doDatesMethod vai usar o field dates... isso gera erro?
//ou pode travar o sistema??
}
}
Sincronização tem a ver com permissão de execução de um bloco de código (entre { e }), e não com dados. Essa permissão é dada ao possuidor do lock declarado para o bloco.
Todo objeto (veja bem, objeto e não classe) disponibiliza um lock, que pode ser disputado por QUALQUER bloco sincronizado sob uma mesma JVM.
Que objetos eu posso utilizar como lock?
instâncias usando new (inclusive o objeto trivial new Object());
O autoponteiro this;
O objeto Class de uma classe XXX, que pode ser obtido assim:
XXX.class
Class.forName(“XXX”)
xxx.getClass()
instâncias usando o método newIntance() da classe Class.
Sincronização tem a ver com permissão de execução de um bloco de código (entre { e }), e não com dados. Essa permissão é dada ao possuidor do lock declarado para o bloco.
Todo objeto (veja bem, objeto e não classe) disponibiliza um lock, que pode ser disputado por QUALQUER bloco sincronizado sob uma mesma JVM.
Que objetos eu posso utilizar como lock?
instâncias usando new (inclusive o objeto trivial new Object());
O autoponteiro this;
O objeto Class de uma classe XXX, que pode ser obtido assim:
XXX.class
Class.forName(“XXX”)
xxx.getClass()
instâncias usando o método newIntance() da classe Class.[/quote]
ok mas keria saber o seguinte…
se eu sincronizo um Array… ele da loock em todos os objetos dentro da array??? se naum… como procedo o lock?? o q fica impedido de ser feito enquanto eu estou sincronizando a array… vlw
Como eu disse, Another-X, não se pode “dar lock” em dados. Um array é uma estrutura (também é um objeto) que quarda referências a vários outros objetos. Tanto o “esqueleto”, quanto os seus objetos referidos podem ser acessados por diferentes threads, sincronizadas ou não. O que define a utilidade da sincronização é o esquema bolado pelo desenvolvedor para evitar a corrupção de dados por acesso simultâneo a alguma peça de dado.
o Java Como Programar tem um exemplo de produtor/consumidor no capitulo de Threads bem legalzinho pra vc pegar isso ai, te posto outra hr o codigo q to meio atrasado agora!
meu problema é esse… para q eu possa trabalhar sem corrupçao eu tenho q assegurar q a array esteja com lock… e q todos os seus objetos tenham LOCK para q eu possa assim… fazer um loop sem q haja mudança nos dados… para não haver erros…
queria só saber… c eu dou lock numa array… os objetos ficam impedidos de ter atualizações…