1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Dúvida com Thread

Estou estudando para certificação, e venho a um tempo estudando com mocks e perguntas de comentadas em fóruns, fiquei um pouco confuso com essa pergunta aqui do GUJ (as respostas contidas no link não me ajudaram muito).

Segue a questão:

import java.util.*;  

public class NameList1 {  
    private List names = new ArrayList();  

    public synchronized void add(String name) {  
        names.add(name);  
    }  

    public synchronized void printAll() {  
        for (int i = 0; i < names.size(); i++) {  
            System.out.print(names.get(i) + " ");  
        }  
    }  

    public static void main(String[] args) {  
        final NameList1 sl = new NameList1();  
        for (int i = 0; i < 2; i++) {  
            new Thread() {  
                public void run() {  
                    sl.add("A");  
                    sl.add("B");  
                    sl.add("C");  
                    sl.printAll();  
                }  
            }.start();  
        }  
    }  
}  

/* 
Which two statements are true if this class is compiled and run? 
(Choose two.) 
A. An exception may be thrown at runtime. 
B. The code may run with no output, without exiting. 
C. The code may run with no output, exiting normally. 
D. The code may rum with output ?A B A B C C ?, then exit. 
E. The code may rum with output ?A B C A B C A B C ?, then exit. 
F. The code may ruin with output ?A A A B C A B C C ?, then exit. 
G. The code may ruin with output ?A B C A A B C A B C ?, then exit. 
Answer: EG 
*/
  • A alternativa E não é um problema para mim, uma vez que os métodos add e printAll são sincronizados, então pela lógica a saída A B C A B C A B C realmente é esperada.

  • Eu sei que a alternativa F está errada porque existem 4 letras A no output. O que não seria possível.

  • Mas por que a G está correta? The code may ruin with output ?A B C A A B C A B C ?, then exit. uma vez que os métodos estão sincronizados como eles permitem que as execuções "se misturem" ?

Estou meio perdido, se alguém puder me dar alguma explicação ou passar um link que a tenha ficarei muito agradecido

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java threads certificação ou faça a sua própria pergunta.