Funcionamento interno do ConcurrentSkipListSet, diferença do TreeSet

Aug 23 2020

A única diferença que entendo é entre os iteradores. SkipListtem consistência fraca , enquanto TreeSettem falha rápida . Fora isso, não vejo nenhum método sincronizado dentro SkipList(embora esteja no pacote Concurrent).

Alguém pode me explicar como é SkipListconcorrente quando não tem nenhuma sincronização nele? Em quais problemas isso pode me ajudar e por que devo usá-lo além dessa diferença entre Iteradores?

Respostas

2 deduper Aug 23 2020 at 06:40

…como o SkipList é simultâneo quando não tem nenhuma sincronização nele?…

TL;DRConcurrentSkipListSeté concorrente porque os elementos que contém não podem ser gravados ao mesmo tempoexecutando threads simultaneamente . Ele atinge sua simultaneidade sem usarsynchronizede trava.


a versão longa

A simultaneidade no contexto das coleções simultâneas não significa necessariamente que todas essas classes implementam segurança de encadeamento usando monitores ( também conhecido como a palavra- synchronizedchave ).

Primeiro, você deve entender que a segurança do encadeamento é essencialmente garantir que dois ou mais encadeamentos concorrentes não modifiquem o estado compartilhado de um aplicativo. Então você percebe que existem outras maneiras ( algumas com mais desempenho ) além de synchronizedobter segurança de thread.

Certificar-se de que seu estado não pode ser modificado ( que é imutável ) em primeiro lugar é uma maneira simples, mas muito eficaz, de obter segurança de thread.

Além disso, uma classe pode ser thread-safe delegando suas responsabilidades de segurança de thread para uma classe diferente, thread-safe.

ConcurrentSkipListSeté considerado concorrente porque, como diz seu Javadoc, é: „ Inserção, remoção, atualização e operações de acesso executadas com segurança simultaneamente por vários threads “.

Ele alcança sua simultaneidade porque delega suas responsabilidades de segurança de thread para uma classe thread-safe ; a saber: ConcurrentSkipListMap.

ConcurrentSkipListSeté thread-safe porque ConcurrentSkipListMapé. E ConcurrentSkipListMapé thread-safe porque, ao usar AbstractMap.SimpleImmutableEntryinternamente, garante que nenhum de seus estados ( suas chaves e valores ) possa ser modificado pelas threads em execução no momento, pois seu estado é imutável .

Você pode ver ConcurrentSkipListSeta delegação ConcurrentSkipListMapem vários lugares no código-fonte ao qual vinculei acima. Se você estiver interessado em aprender mais sobre como delegar thread safety , recomendo que leia o Capítulo 4, Compondo objetos, Java Concurrency in Practice .

…Em quais problemas isso pode me ajudar

Ao usá-lo, você obtém segurança de thread gratuita . O tipo que tem muito mais desempenho - e com muito menos risco de dar um tiro no pé - do que usar synchronized.

…por que eu deveria usá-lo além dessa diferença entre Iteradores?

Se o estado de seu aplicativo precisar ser armazenado em alguma coleção e essa coleção for acessível de qualquer maneira para encadeamentos em execução simultânea, usar ConcurrentSkipListSeté uma opção segura para encadeamento que você possui.