Synchronized

bom to com uma dúvida aki… com synchronized

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??
      }
   }

vlw ai galera

Vc pode deixar o metodo sincronizado tbem mano. Mas a classe nunca

Olá, Another-X,

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=“hipersoft”]Olá, Another-X,

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!

:space:

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…

obrigado