Synchronizer

9 respostas
O

pra q serve o comando synchronizer
?
qual seria um ex de quando eu posso utiliza-lo

9 Respostas

J

O modificador synchronized é usado em um ambiente multi-thread, para proteger dados de um acesso simultaneo de varias threads:

ex.:

public class ContaBancaria{
   private double saldo;

   public void depositar(double valor){
      if(valor>0){
        saldo += valor;
      }
   }

   public void sacar(double valor){
      if(valor>0){
         if(autorizarSaque(valor){
            saldo -= valor;
         }
      }
   }

   public boolean autorizarSaque(double valor){
      return saldo>=valor;
   }
}

Nesse caso, se tivermos varias threads acessando o mesmo objeto ContaBancaria, teremos grandes problemas, pois as threads podem acessar simultaneamente o atributo saldo, e isso poderia gerar um resultado totalmente inesperado, um saldo negativo por examplo, veja:

saldo da conta = 1500
thread1 - inicia
thread1 - tenta fazer saque de 500, o metodo sacar chama o autorizarSaque, que verifica se o saldo é maior que 500, como o saldo é 1500, ele autoriza o saque

thread1 - para, antes de subtrair o valor, o saque foi autorizado, mas a thread está parada exatamente onde vai ser subtraido o valor
thread2 - inicia
thread2 - tenta fazer saque de 1200, o metodo sacar chama o autorizarSaque, que verifica se o saldo é maior que 1200, como o saldo é 1500, ele autoriza o saque
thread2 - subtrai o valor do saldo, sobrando 300 de saldo
thread2 - morre
thread1 - reinicia de onde parou, agora é hora de subtrair o valor, subtrai 500 do saldo
thread1 - morre

resultado, saldo = -200

para evitar isso colocamos um modificador synchronized nos metodos ou em um bloco do codigo, para que enquanto uma thread estiver executando aquele bloco, as outras tenham que aguardar..

modificamos o codigo para:

public class ContaBancaria{
   private double saldo;

   public synchronized void depositar(double valor){
      if(valor>0){
        saldo += valor;
      }
   }

   public synchronized void sacar(double valor){
      if(valor>0){
         if(autorizarSaque(valor){
            saldo -= valor;
         }
      }
   }

   public boolean autorizarSaque(double valor){
      return saldo>=valor;
   }
}

Agora o que acontece é isso:

saldo da conta = 1500
thread1 - inicia
thread1 - tenta fazer saque de 500, o metodo sacar chama o autorizarSaque, que verifica se o saldo é maior que 500, como o saldo é 1500, ele autoriza o saque

thread1 - para, antes de subtrair o valor, o saque foi autorizado, mas a thread está parada exatamente onde vai ser subtraido o valor
thread2 - inicia
thread2 - tenta fazer saque de 1200, o metodo é sincronizado e outra thread já está executando ele, então thread2 aguarda
thread1 - reinicia de onde parou, subtrai 500 do saldo, o saldo fica com 1000
thread1 - morre
thread2 - reinicia, agora o metodo já pode ser executado, o metodo sacar chama o autorizarSaque, que verifica se o saldo é maior que 1200, como o saldo é de 1000, não autoriza o saque
thread2 - morre

resultado, saldo = 1000

ok?

Mais informações sobre isso você encontra aqui no forum mesmo, é só procurar...

O

veio…mas explicadu q issu impossivel…

vlw mesmo cara…

as otras duvidas eu tiro aqui memu…se não consegui eu volto a posta…

vlw…fui

O

bom…agora minha unica duvida eh em relaçãoa threads …

tipo…dei uma pesquisada na internet i vi q uma threads é o mesmo que um processo, porem um processo compartilhado…seria isso mesmo ou eu intendi erradu??

soh nao intendi quem é q usa uma threads e quando eu vo usa-la realmente…

tem como da uma exclarecida melhor sobre esse assunto…

vlw aee

J

Uma thread é basicamente a subdivisão de um processo em outros processos menores, cada “pedaço” do processo é uma Thread…

Você usa thread quando precisa processar duas coisas ao mesmo tempo, seria algo como um aplicativo “multi-tarefa” a grosso modo… você poderia ter uma Thread acessando um banco de dados e outra baixando alguma coisa da internet por exemplo…

Um exemplo de Thread seria por exemplo em um browser, como o Firefox, imagine que você esteja carregando uma pagina, e tenha uma imagem grande nessa pagina, durante o carregamento dessa imagem você quer rolar a pagina, usando a barra de rolagem, se o browser não usasse uma Thread pra baixar a imagem, você teria que esperar ele terminar pra rolar a pagina, pois ou ele faz uma coisa, ou outra… mas com a Thread, ele pode fazer as duas “ao mesmo tempo”…

O

HUmm…to começando a intende o baratu rrs…

bom…minha duvida agora é … uma thread é uq fisicamente??

seria uma porção de códigos…como funções??..classes?? um aplicativo completo??

q q ele seria na vdd

i o comando synchronizer seria somente para trabalha com threads??

t++ aii galera…to aprendedu pra caraio com esses topicos…
rsrs

J

Uma Thread é como eu falei, um subprocesso.

Mas em codigo Java, seria uma instancia da classe java.lang.Thread, essa classe possui um metodo run(), onde pode ser colocado o codigo a ser executado pela thread, ou pode ser passado um objeto que implemente a interface java.lang.Runnable, o que é mais comum.

Tente executar esse codigo pra você ver como funciona.

public class Principal {

	public static void main(String[] args) {
		Thread t1 = new Thread(new Contador());
		t1.setName("Primeira");
		Thread t2 = new Thread(new Contador());
		t2.setName("Segunda");
		Thread t3 = new Thread(new Contador());
		t3.setName("Terceira");
		t1.start();
		t2.start();
		t3.start();
	}

	static class Contador implements Runnable{
		public void run(){
			for(int i=0;i<10000;i++){
				System.out.println(Thread.currentThread().getName()+": "+i);
			}
		}
	}
}

No artigo da wikipedia que passei tambem tem um exemplo.

O

hummmmmmm…axo q intendi agora…

bom…a thread não dexa de ser uma classe que fica como um processo no computador…

bom, agora vai outras perguntinhas::

  • ela executa infinitamente até que se pare ela por algum comando ???
  • qual é a ordem de execução dela…ela torna a ser executada (invocada) depois que ela (classe) é processada por completa?? ou ela eh executada em um determinado tempo (x em x milisegundos por ex)…
  • o comando synchronizer é utilizado somente para threads??

flw ae…diria q uns 70% intendido kkk

S

Não é um processo. Processos são controlados pelo SO. Threads, pelo próprio programa.

  • Só executa uma vez e pode ser interrompida.

  • Só executa uma vez e não necessariamente vai terminar antes que outra thread execute. Pode parar no meio, outra executa um pedaço, volta pra ela, e por aí vai. Não tem um tempo fixo pra isso.

  • É pra indicar que só uma thread pode acessar o método/bloco de cada vez. É synchronized.

O

haha sim…intendi …

soh uma otra coisa…

nesse exemplo do jairelton eu vi algo meio estranho na execução das threads…

tipo…
a thread 1 executo de 1 á 37 i depois as outras threads começaram realmente…i logo mais aconteceu a mesma coisa com as outras threads…elas executaram até um determinadu tempo sem q as outras não executasse nenhuma vez…

isso seria uq?? NADA … algo normal q ocorre no processador?? ou por algum motivo especifico…pois o correto não era elas começarem juntas i terminarem juntas e sincronizadas??

ex:

Primeira: 0
Segunda: 0
Tercera: 0

Primeira: 1
Segunda: 1
Tercera: 1


i outra coisa…

pra q serve o comando Static dentro da classe interna … pq ela não pode não ser static q da problema??

eu conheço o conceito de static mais nesse caso (para classe) não intendi

vlww aee galerinha…

Criado 18 de novembro de 2006
Ultima resposta 20 de nov. de 2006
Respostas 9
Participantes 3