Quando uma classe sincronizada não é ThreadSafe

Viajando um pouco por alguns blogs, me deparei com esse post:

http://rayfd.wordpress.com/2007/11/11/when-a-synchronized-class-isnt-threadsafe/ (Inglês)

Quando uma classe sincronizada é ou não Threadsafe (no artigo o autor fala sobre ArrayList e Vector nos exemplos dele)

que uma classe ser sincronizada não é garantia de que ela seja Threadsafe
ou aquele velho conselho “use Vector ao invés de ArrayList se você for trabalhar com Threads, porque ela é sincronizada”

Eu gostei bastante do post, achei que seria interessante ter alguma discussão sobre isso.

o que vocês acham? já tiveram problemas com isso? se sim, quais? e como resolveram.

Na verdade, há pouquíssimas razões para se trocar o ArrayList pelo vector. Note que o código sincronizado que ele gerou na parte de baixo:

synchronized (list) { list.clear(); list.add(?888″); list.remove(0); }

Seria seguro mesmo para um ArrayList. Desde que em todos os trechos onde fosse usado houvessem sincronizações desse tipo.

O importante é entender os tipos de thread-safety. Uma classe pode ser:

Imutável: Então, ela aparece como constante para os clientes. Nesse caso, não há necessidade de sincronização, mas ainda sim há thread-safety;
Thread-safe: Tem todos os seus métodos sincronizados. Então, chamadas sequenciais aos seus métodos por diversas threads não tornam o seu estado inválido. Isso não significa que as chamadas “entre” os métodos seja segura. Mas só que a classe, por si só, não permitirá que uma thread corrompa seu estado. Exemplos: Classe java.util.Timer
Thread-safe condicional: Igual a acima, mas existe uma ordem específica que os métodos devam ser chamados para que a classe se torne thread-safe. Para eliminar a possibilidade de interferência, o cliente deveria requisitar um lock antes de iniciar suas operações. Um exemplo disso é a classe Vector e HashTable.
Compatível com threads: A classe pode ser usada de maneira segura, desde que em todos os locais que seja chamada exista um código sincronizado. Um exemplo é, como expliquei ali em cima, o ArrayList. E, geralmente, é o que acontece no caso das listas.
Hostil com threads: A classe não pode ser usada em ambientes multi-thread, nem mesmo com a presença de sincronização em seus métodos. Geralmente ocorre com classes que dependem de recursos externos, não sincronizados. Ou classes que acessem singletons não thread-safe.

galera estou com uma problema, pois minha variavel que esta no servidor nao esta compartilhada a todos os clientes

SOCKEt

Caso puderem me dar um help… me add lucaslimeira@hotmail.com

Deve ser alguma bestera de threads.

vlw

A única coisa que se ganha com uma classe sincronizada como o Vector é garantir que nunca vai ter alguma thread fazendo as operações básicas da lista ‘ao mesmo tempo’ que outra. Isso não deixa a pessoa livre de problemas ao ponto de ter zero preocupações.