Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre sincronização na chamada do ArrayList

Sobre a aula 4 do curso de Thread1. Sabemos que o ArrayList não é sincronizado. Porém, será que seria possível usar mesmo o arrayList e incronizar o metodo que o chama? Assim mesmo o método add, por ex, do Array não sendo sincronizado, garantimos a sincronia antes deste ser chamado. O que tem de errado nessa minha abordagem que eu não estou conseguindo enxergar?

2 respostas
solução!

Sim, é possível sincronizar um ArrayList. Para tal, a própria API Collections do java.util possui um método estático chamado Collections.synchronizedList, que retorna a lista que foi passada como argumento, mas sincronizada. Por exemplo, se definirmos

List listaSincronizada = Collections.synchronizedList(new ArrayList<UmaClasseQualquer>());

, todas as interações com essa lista ocorrerão de forma sincronizada. Além disso, é possível ter um único método sincronizado, por exemplo:

public synchronized void adicionaElemento(String texto) {
        self.listaDeElementos.add(texto);
    }

Entretanto, é importante lembrar que este método só será sincronizado consigo mesmo, ou seja, se tivermos que ter outro método que remove um elemento dessa lista, eles não estarão sincronizados entre si, o que ocasionalmente gerará problemas.

Eduardo Pietre, muito obrigado. Respondeu completamente minha duvida.O método sincroniza sim, mas qualquer um poderia acessar a lista dessincronizada exposta... pelo que vc expôs do metodo estatico da Collections a abordagem anterior não teria justificativa. Foi apenas uma curiosidade didática mesmo. Obrigado.