gilsonmv 0 Denunciar post Postado Novembro 28, 2009 Olá, Isso deve ser bem básico, mas vamos lá, eu estava estudando sobre threads e vi o seguinte código (Preste atenção na linha em vermelho): public class TestThead1 implements Runnable { public void run() { String str = "hello"; synchronized(str) { try { System.out.print(Thread.currentThread().getName()); Thread.sleep(500); System.out.print(Thread.currentThread().getName()); } catch (InterruptedException e) {} } } public static void main(String args[]) { new Thread(new TestThead1(), "A").start(); new Thread(new TestThead1(), "B").start(); } } Pois bem este código Java imprime "AABB" ou "BBAA", a explicação é que "hello" é uma string literal e portanto é compartilhada pelas duas threads e portanto a sincronização é feita com objeto "hello". Mais adiante vi o seguinte código (Preste atenção na linha em vermelho): public class TestThead1 implements Runnable { public void run() { String str = new String("hello"); synchronized(str) { try { System.out.print(Thread.currentThread().getName()); Thread.sleep(500); System.out.print(Thread.currentThread().getName()); } catch (InterruptedException e) {} } } public static void main(String args[]) { new Thread(new TestThead1(), "A").start(); new Thread(new TestThead1(), "B").start(); } } Veja que a diferença é apenas de "hello" para new String("hello") e o resultado desta thread é "BABA" ou "ABAB". A explicação é de que esta string é local do método e não há sincronização, pois, são objetos "hello" diferentes. Uma vez ouvi falar que a JVM fazia referência para strings iguais (e todo aquele papo de ser imutável), então se eu atribuísse uma string "aaa" (ex.: String a = "aaa") para uma variável e a mesma representação literal para outra variável "aaa" (ex.: String aa = "aaa"), na JVM haveria apenas um objeto string e inclusive a comparação das duas variáveis retornaria TRUE (ex.: a == aa retornaria true). Alguém sabe me explicar como a JVM trata Strings? Abraços, Gilson. Compartilhar este post Link para o post Compartilhar em outros sites
Giovanni Ritchie 0 Denunciar post Postado Dezembro 5, 2009 Isso poderá ajudar: http://imasters.com.br/artigo/7131/java/entendendo_as_classes_string_stringbuilder_e_stringbuffer/ http://forum.imasters.com.br/public/style_emoticons/default/natal_noel.gif Compartilhar este post Link para o post Compartilhar em outros sites
tllsae 0 Denunciar post Postado Dezembro 9, 2009 "aaa" chama o construtor uma só vez. new String("aaa") chama o construtor duas vezes. No final o resultado é o mesmo, só que o primeiro caso, além de ser mais simples, é mais eficiente. Compartilhar este post Link para o post Compartilhar em outros sites