Strings fornecendo o lock para Threads

Vamos comparar a diferença entre os três objetos abaixo criados no fornecimento do Lock para Threads sincronizadas.

    String s = “pedro”;

    String s = new String(“pedro”);

    static String s = “pedro”;

 

 

 

 

// No caso abaixo, a string é um literal. Como é sabido, a JVM mantem um pool de strings para otimizar o uso de sua memória quando declaramos-a como um literal, ou seja, para as duas instâncias de Tr, a string será a mesma.

 
 

Observe que o bloco sincronizado utiliza o lock do mesmo objeto string no heap, portanto o output sai organizado.

 
 

import java.lang.Thread;

import java.lang.Runnable;

 
 

public class Teste {

public static void main(String[] args){

Tr tr1 = new Tr();

Tr tr2 = new Tr();

tr1.start();

tr2.start();

 
 

}        

}

 
 

class Tr extends Thread {

String s = “Pedro”;

public void run(){

synchronized(s){

int i = 0;

while(i++ < 5){

try {

Thread.sleep(1000);

} catch (InterruptedException e){}

System.out.println(Thread.currentThread().getName());

}

}

}

}

 

Output:

Thread-0

Thread-0

Thread-0

Thread-0

Thread-0

Thread-1

Thread-1

Thread-1

Thread-1

Thread-1

 

// No caso abaixo a string foi declarada como um objeto, ou seja, para cada instância de Tr teremos um objeto string diferente.

 
 

Neste caso, observe que o bloco sincronizado utiliza o lock de duas instâncias diferentes de string (uma para cada instância de Tr) por isso o output sai misturado

 
 

 
 

import java.lang.Thread;

import java.lang.Runnable;

 
 

public class Teste {

public static void main(String[] args){

Tr tr1 = new Tr();

Tr tr2 = new Tr();

tr1.start();

tr2.start();

 
 

}        

}

 
 

class Tr extends Thread {

String s = new String(“Pedro”);

public void run(){

synchronized(s){

int i = 0;

while(i++ < 5){

try {

Thread.sleep(1000);

} catch (InterruptedException e){}

System.out.println(Thread.currentThread().getName());

}

}

}

}

Output:

Thread-1

Thread-0

Thread-1

Thread-0

Thread-1

Thread-0

Thread-1

Thread-0

Thread-1

Thread-0

 

 

Abaixo utilizamos um membro estático string para fornecer o lock.

 
 

import java.lang.Thread;

import java.lang.Runnable;

 
 

public class Teste {

public static void main(String[] args){

Tr tr1 = new Tr();

Tr tr2 = new Tr();

tr1.start();

tr2.start();

 
 

}        

}

 
 

class Tr extends Thread {

static String s = “Pedro”;

public void run(){

synchronized(s){

int i = 0;

while(i++ < 5){

try {

Thread.sleep(1000);

} catch (InterruptedException e){}

System.out.println(Thread.currentThread().getName());

}

}

}

}

Output:

Thread-1

Thread-1

Thread-1

Thread-1

Thread-1

Thread-0

Thread-0

Thread-0

Thread-0

Thread-0

 

Esta entrada foi publicada em Threads com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s