SlideShare uma empresa Scribd logo
.NET
Threading
INTRODUÇÃO A PROGRAMAÇÃO CONCORRENTE
Processos vs Threads
 Processos são containers mapeados para um endereço de memoria no
qual outros processos não tem permissão de leitura
Memoria Processos
Threads
 Roda todo ou parte do código dentro de um
processo
 Tem acesso a um pedaço ou toda memoria
mapeada para o processo
 Toda thread tem sua propina copia da
callstack e registradores da CPU.
 Um processo sem nenhuma thread é
finalizado, já que não esta realizando nenhum
execução.
Vantagens do uso de multi-threading
 Possibilidade de escalar as operações da CPU a partir de paralelização de
processamento de dados (assumindo um hardware com multi-core/multi-
processadores)
 Realizar operações variadas enquanto esperamos por operações de I/O
finalizem.
 Manter uma UI responsiva
Preocupações com muti-threading
 Adiciona complexidade ao programa
 Linhas de código
 Leitura
 Testabilidade
 Execução mais lenta em maquinas com
um core ou processador
Como iniciar um thread?
Como iniciar thread com parâmetros
Threads com métodos de instancia
Tempo de vida de uma thread
 Uma thread para quando
 O método da thread retorna
 Ocorre um exception não tratada (synchronous exception)
 Outra thread para ela com “Interrupt”ou “Abort” (asynchronous exception)
A propriedade IsAlive prove um snapshot instantaneo do status da thread
IsAlive == false
Como parar uma thread?
Idealmente é ter uma logica pré-definida para abortar a execução
Thread-pool
 Prove uma forma em que as threads são
emprestadas para operações
concorrentes que sejam rápidas.
 CLR prove uma thread-pool por
processo.
 Threads são adicionadas ou removidas
de acordo com a demanda
 Permite que o custo de criar e matar
threads seja reduzido durante a vida do
processo
 Por padrão tem a propriedade
IsBackground definida como `true`
 Usado de implicitamente forma padrão
ao utilizar Async I/O, Delegate.Invoke,
Parallel.For, PLINQ
Parallel.For e PLINQ
Usam por padrão o threadpool
ThreadLocal State
“System.NotSupportedException -> WebClient does not support concurrent I/O operations.”
ThreadLocal State
Com isso seu programa instancia mais de 100 WebClients, seu programa lança uma exceção que
informa que seus webclients estão dando timeout. Você percebe que é porque sua máquina não
está executando um sistema operacional de servidor, e há um limite máximo no número de
conexões simultâneas.
ThreadLocal State
Nesse caso, cada operação de acesso a dados é inteiramente independente um do outro.
O uso do thread-local state nos permitiu garantir que gerássemos apenas tantos objetos
WebClient quanto necessário, e que cada WebClient pertence a thread que o gerou.
ThreadLocal State
O mesmo é conseguido com PLINQ utilizando o ThreadLocal<>, porém é importante ressaltar
que, em qualquer cenário, usando o tipo ThreadLocal<> é mais custoso do que usar o overload
de ThreadLocalState do Parallel.ForEach
Sincronização de threads
 A maior parte dos recursos dentro de um programa não são pensados
para serem usados de forma concorrente.
 Collections (array, list, dictionary, etc)
 Files
 Mesmo inteiros
Oque deveria ser exibido?
Oque será exibido?
Sessões criticas
 Uma sessão critica é uma região do código que ira acessar um recurso
compartilhado:
Race
Condition
Solução 1: Atomic updates
 Maior parte dos processadores suportam atomic updates
Solução 2: Particionamento
Solução 3: Wait Based Synchronization
 Quando threads necessitam de acessar o mesmo recurso que não pode ser
particionado (adicionar ou remover um no de uma lista, ou manipular o
mesmo arquivo)
 Algumas vezes queremos que uma thread esteja block ate algum evento
ocorrer.
 A casos que os dados dependem de um passo anterior inviabilizando
particionamento.
 Quando o input de uma thread depende do output de outra
 Calcular a sequencia de Fibonacci
 Sequence[0] = Sequence[1] = 1
 Sequence[n] = Sequence[n-1]+Sequence[n-2]
Wait-Based Thread Synchronization
Wait-Based Thread Synchronization
Primitives
 Existem vários primitivos para controle de threads no CLR
System.Threading:
 Monitor
 Mutex
 ReaderWriterLockSlim
 ManualResetEvent, AutoResetEvent
 Semaphore, SlimSemaphore
 Os 3 primeiros compartilham o mesmo modelo de uso:
 Faz uma chamada para adquirir o owner do “lock”
 Usa o recurso compartilhado que o “lock” designado visa proteger
 Faz um chamada para liberar o “lock” assim que o recurso não é mais
necessário
System.Threading.Monitor
 Monitor garante acesso exclusivo a um recurso
 CLR permite apenas uma thread entrar no contexto do
monitor por vez
 Outras threads que tentarem entrar irão ficar bloqueada
 Assim que o recurso for liberado a próxima thread na
espera ira adquirir para si o acesso exclusivo ao recurso
Monitors no CLR
 Metodos do monitor operam em cima de uma referencia de um objeto
 Qualquer referencia de objeto no HEAP pode potencialmente ser associado a
um lock
Monitor: Tratar exceptions
C# Monitor syntax sugar
Hold & Wait
 As vezes uma thread precisa e esperar alguma coisa enquanto segura um
lock
 Em scenarios de producer/consumer é comum ter que lidar com
gerenciamento de disponibilidade de recursos.
 Mutipla aquisição de locks
Hold & Wait com Monitors
ManualResetEvent
 Controle de fluxo
 Precisa ser
explicitamente
resetado
AutoResetEvent
 Controle de fluxo
 É resetado a cada
WaitOne
DEADLOCK
DEADLOCK
 Deadlocks podem ocorrer a qualquer momento em que esteja numa
situação de Hold & Wait
 Enquento segura um lock a thread tenta obter outro lock
Deadlocks podem ocorrer mas não necessariamente vão ocorrer
Deadlocks são possíveis mas não necessariamente prováveis (a probabilidade
aumenta de acordo com o # de threads/processadores/cores)
Deadlock podem talvez ser temporário caso seja utilizado timeouts nas aquisições
de lock
COMO ACONTECE?
Mutexes
 Um Mutex é um objeto de Kernel (Sytem.Threading.Mutex)
 Suporta timeout em aquisições de lock
 Nomeável, permite sincronização cross-process na mesma maquina
 Habilita o uso múltipla aquisições de lock com de deadlock-free via
WaitHandle.WaitAll
 Tradeoffs
 Chamadas de aquisições e liberação de locks sempre ocorrem em kernel mode
 Objetos de kernel devem ser fechados assim que não mais necessários (ocorre
automaticamente mas depende do GC)
Código propicio a deadlock
Sem deadlock
Semaphore
 Funciona de forma similar ao Monitor ou Mutex, porem ele delimita
quantas threads podem acessar uma sessão critica ao mesmo tempo.
 É como uma balada como uma fila, aonde as pessoas na fila esperam uma
pessoa sair da balada para entrar.
 System.Threading.SemaphoreSlim é mais leve, não faz chamdas de kernel, para
ser usado em apenas um processo.
 System.Threading.Semaphore pode ser nomeado e funciona entre processos
 Não tem garantia de ordem
Semaphore
ReaderWriterLockSlim
 Possui trem modos : Read, Write e Ungradeable
 Muitas threads podem estar simutaneamente em modo Read
 Apenas uma pode entrar em modo Ungradeable mas outras threads
podem entrar em modo read
 Apenas uma Thread pode entrar em modo write, e nenhuma outra thread
pode adquirir um lock
Concurrent Collections
Immutable Collections
 NuGet System.Collection.Immutable
 Thread Safe por definição
Keyword : volatile
 Não reordena instruções na memoria
 “Garante” que a leitura do valor mais novo será realizada
 Resolvia o problema de double null check em versões do .NET < 2
 Deve ser evitado
 Apenas utilizado em casos em que o cenario de locks não esta atendendo
a performance desejada
E o TPL? Async await?
 IMPORTANTE: Assíncrono não é equivalente a paralelo.
 A classe Task ou ValueTask não necessariamente estão vinculadas com
threads.
 O Método estático Task.Run() ou Task.Factory.StartNew() sempre inicia
uma thread, e é a forma recomendada para se criar threads no .NET
moderno.
 Mais sobre isso na proxima, sobre .NET Assincrono

Mais conteúdo relacionado

ODP
Programação Paralela - Threads
PPTX
Trabalho sistemas operacionais
PDF
Java memory model primary ref. - faq
PPT
Thread Java
PDF
Apostila metasploit
PPTX
Slide curso metasploit
PPT
Gerência de Processos: Deadlocks
PPTX
Slide Palestra "Metasploit Framework"
Programação Paralela - Threads
Trabalho sistemas operacionais
Java memory model primary ref. - faq
Thread Java
Apostila metasploit
Slide curso metasploit
Gerência de Processos: Deadlocks
Slide Palestra "Metasploit Framework"

Mais procurados (20)

PPT
Gerências de Processos: Sincronização
PDF
Arquitetura de Computadores: Processos e Threads
PDF
Criando Aplicações Resilientes
ODP
Gerência de Redes - 2.Modelo SNMP
PDF
Apt_vagrant_chef_olavo_queiroz
PPT
Sistemas Operacionais Modernos Capítulo 3 Deadlock
PPTX
Processos threads senai
PDF
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
PDF
Aula 02-processos-e-threads-tanenbaum-parte-1
PPT
05tolerancia
PDF
(ACH2044) Sistemas Operacionais - Aula 09
ODT
[Tutorial] metasploit
ODP
Mutexes, Monitores e Semáforos
PDF
(ACH2044) Sistemas Operacionais - Aula 12
PPTX
Docker e outras ferramentas Devops
PDF
(ACH2044) Sistemas Operacionais - Aula 10
PDF
Processos e threads cap 02 (i unidade)
PPT
Gerenciamento de Servidores Linux utilizando SNMP
PPT
Gerências de Processos: Escalonamento de CPU
PDF
(ACH2044) Sistemas Operacionais - Aula 02
Gerências de Processos: Sincronização
Arquitetura de Computadores: Processos e Threads
Criando Aplicações Resilientes
Gerência de Redes - 2.Modelo SNMP
Apt_vagrant_chef_olavo_queiroz
Sistemas Operacionais Modernos Capítulo 3 Deadlock
Processos threads senai
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Aula 02-processos-e-threads-tanenbaum-parte-1
05tolerancia
(ACH2044) Sistemas Operacionais - Aula 09
[Tutorial] metasploit
Mutexes, Monitores e Semáforos
(ACH2044) Sistemas Operacionais - Aula 12
Docker e outras ferramentas Devops
(ACH2044) Sistemas Operacionais - Aula 10
Processos e threads cap 02 (i unidade)
Gerenciamento de Servidores Linux utilizando SNMP
Gerências de Processos: Escalonamento de CPU
(ACH2044) Sistemas Operacionais - Aula 02
Anúncio

Semelhante a Net - Threads (20)

PPT
Threads - .Net Framework 4.0
PPT
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...
PPTX
Threads tasks e o tal do thread pool
PDF
Async/Await Pattern in C#
PPTX
Parallel Programming no .NET 4.0
ODP
12 threads
PDF
Artigo Threads O Problema Dos Leitores E Escritores Implementado Em C# Rafael...
PDF
Funcamentos de Programação Concorrente
PDF
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
PDF
Aula sobre multithreading
PDF
Threads 03: Ciclo de vida, aplicações e boas práticas
PDF
Threads
PDF
Threads 01: Criação e controle de threads
PDF
Threads 02: Acesso exclusivo e comunicação entre threads
PPTX
SO - Integrado - Aula 02 - Processos e Threads.pptx
PDF
Threads 08: Executores e Futures
PDF
Trabalhando com Threads em JAVA
PDF
APM Model in .NET - PT-pt
PDF
Gerenciamento-de-Processos-Uma-Visao-Geral.pdf
Threads - .Net Framework 4.0
Apresentação do artigo THREADS: O PROBLEMA DOS LEITORES E ESCRITORES IMPLEMEN...
Threads tasks e o tal do thread pool
Async/Await Pattern in C#
Parallel Programming no .NET 4.0
12 threads
Artigo Threads O Problema Dos Leitores E Escritores Implementado Em C# Rafael...
Funcamentos de Programação Concorrente
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Aula sobre multithreading
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads
Threads 01: Criação e controle de threads
Threads 02: Acesso exclusivo e comunicação entre threads
SO - Integrado - Aula 02 - Processos e Threads.pptx
Threads 08: Executores e Futures
Trabalhando com Threads em JAVA
APM Model in .NET - PT-pt
Gerenciamento-de-Processos-Uma-Visao-Geral.pdf
Anúncio

Mais de Lucas Teles (17)

PPTX
Type script alem do arroz com feijao
PPTX
Conheça ROP - Programação orientada e trilhos​
PPTX
Fabulous - Xamarin.Forms com Elmish
PPTX
TypeScript - Além do arroz com feijão
PPTX
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
PPTX
Algoritmos genéticos aplicados em problemas de busca de caminho
PPTX
Algoritmos geneticos
PPTX
Aplicações serverless com Blazor.pptx
PPTX
Simplificando componentes com react hooks
PPTX
Um melhor frontend com elm
PPTX
C# 8 e além
PPTX
F# para devs c# tdc
PPTX
Introducao a azure functions
PPTX
F# para devs c#
PPTX
Block chain para desenvolvedores
PPTX
Generalização prematura e complexidade acidental, a raiz do mal de todo software
PPTX
Elmish com xamarin.forms
Type script alem do arroz com feijao
Conheça ROP - Programação orientada e trilhos​
Fabulous - Xamarin.Forms com Elmish
TypeScript - Além do arroz com feijão
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos geneticos
Aplicações serverless com Blazor.pptx
Simplificando componentes com react hooks
Um melhor frontend com elm
C# 8 e além
F# para devs c# tdc
Introducao a azure functions
F# para devs c#
Block chain para desenvolvedores
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Elmish com xamarin.forms

Último (19)

PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Aula 18 - Manipulacao De Arquivos python
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Custos e liquidação no SAP Transportation Management, TM130 Col18
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Aula 18 - Manipulacao De Arquivos python
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
COBITxITIL-Entenda as diferença em uso governança TI
Aula04-Academia Heri- Tecnologia Geral 2025
Processos na gestão de transportes, TM100 Col18
Apple Pippin Uma breve introdução. - David Glotz
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx

Net - Threads

  • 2. Processos vs Threads  Processos são containers mapeados para um endereço de memoria no qual outros processos não tem permissão de leitura Memoria Processos
  • 3. Threads  Roda todo ou parte do código dentro de um processo  Tem acesso a um pedaço ou toda memoria mapeada para o processo  Toda thread tem sua propina copia da callstack e registradores da CPU.  Um processo sem nenhuma thread é finalizado, já que não esta realizando nenhum execução.
  • 4. Vantagens do uso de multi-threading  Possibilidade de escalar as operações da CPU a partir de paralelização de processamento de dados (assumindo um hardware com multi-core/multi- processadores)  Realizar operações variadas enquanto esperamos por operações de I/O finalizem.  Manter uma UI responsiva
  • 5. Preocupações com muti-threading  Adiciona complexidade ao programa  Linhas de código  Leitura  Testabilidade  Execução mais lenta em maquinas com um core ou processador
  • 6. Como iniciar um thread?
  • 7. Como iniciar thread com parâmetros
  • 8. Threads com métodos de instancia
  • 9. Tempo de vida de uma thread  Uma thread para quando  O método da thread retorna  Ocorre um exception não tratada (synchronous exception)  Outra thread para ela com “Interrupt”ou “Abort” (asynchronous exception) A propriedade IsAlive prove um snapshot instantaneo do status da thread IsAlive == false
  • 10. Como parar uma thread? Idealmente é ter uma logica pré-definida para abortar a execução
  • 11. Thread-pool  Prove uma forma em que as threads são emprestadas para operações concorrentes que sejam rápidas.  CLR prove uma thread-pool por processo.  Threads são adicionadas ou removidas de acordo com a demanda  Permite que o custo de criar e matar threads seja reduzido durante a vida do processo  Por padrão tem a propriedade IsBackground definida como `true`  Usado de implicitamente forma padrão ao utilizar Async I/O, Delegate.Invoke, Parallel.For, PLINQ
  • 12. Parallel.For e PLINQ Usam por padrão o threadpool
  • 13. ThreadLocal State “System.NotSupportedException -> WebClient does not support concurrent I/O operations.”
  • 14. ThreadLocal State Com isso seu programa instancia mais de 100 WebClients, seu programa lança uma exceção que informa que seus webclients estão dando timeout. Você percebe que é porque sua máquina não está executando um sistema operacional de servidor, e há um limite máximo no número de conexões simultâneas.
  • 15. ThreadLocal State Nesse caso, cada operação de acesso a dados é inteiramente independente um do outro. O uso do thread-local state nos permitiu garantir que gerássemos apenas tantos objetos WebClient quanto necessário, e que cada WebClient pertence a thread que o gerou.
  • 16. ThreadLocal State O mesmo é conseguido com PLINQ utilizando o ThreadLocal<>, porém é importante ressaltar que, em qualquer cenário, usando o tipo ThreadLocal<> é mais custoso do que usar o overload de ThreadLocalState do Parallel.ForEach
  • 17. Sincronização de threads  A maior parte dos recursos dentro de um programa não são pensados para serem usados de forma concorrente.  Collections (array, list, dictionary, etc)  Files  Mesmo inteiros Oque deveria ser exibido? Oque será exibido?
  • 18. Sessões criticas  Uma sessão critica é uma região do código que ira acessar um recurso compartilhado:
  • 20. Solução 1: Atomic updates  Maior parte dos processadores suportam atomic updates
  • 22. Solução 3: Wait Based Synchronization  Quando threads necessitam de acessar o mesmo recurso que não pode ser particionado (adicionar ou remover um no de uma lista, ou manipular o mesmo arquivo)  Algumas vezes queremos que uma thread esteja block ate algum evento ocorrer.  A casos que os dados dependem de um passo anterior inviabilizando particionamento.  Quando o input de uma thread depende do output de outra  Calcular a sequencia de Fibonacci  Sequence[0] = Sequence[1] = 1  Sequence[n] = Sequence[n-1]+Sequence[n-2]
  • 24. Wait-Based Thread Synchronization Primitives  Existem vários primitivos para controle de threads no CLR System.Threading:  Monitor  Mutex  ReaderWriterLockSlim  ManualResetEvent, AutoResetEvent  Semaphore, SlimSemaphore  Os 3 primeiros compartilham o mesmo modelo de uso:  Faz uma chamada para adquirir o owner do “lock”  Usa o recurso compartilhado que o “lock” designado visa proteger  Faz um chamada para liberar o “lock” assim que o recurso não é mais necessário
  • 25. System.Threading.Monitor  Monitor garante acesso exclusivo a um recurso  CLR permite apenas uma thread entrar no contexto do monitor por vez  Outras threads que tentarem entrar irão ficar bloqueada  Assim que o recurso for liberado a próxima thread na espera ira adquirir para si o acesso exclusivo ao recurso
  • 26. Monitors no CLR  Metodos do monitor operam em cima de uma referencia de um objeto  Qualquer referencia de objeto no HEAP pode potencialmente ser associado a um lock
  • 29. Hold & Wait  As vezes uma thread precisa e esperar alguma coisa enquanto segura um lock  Em scenarios de producer/consumer é comum ter que lidar com gerenciamento de disponibilidade de recursos.  Mutipla aquisição de locks
  • 30. Hold & Wait com Monitors
  • 31. ManualResetEvent  Controle de fluxo  Precisa ser explicitamente resetado
  • 32. AutoResetEvent  Controle de fluxo  É resetado a cada WaitOne
  • 34. DEADLOCK  Deadlocks podem ocorrer a qualquer momento em que esteja numa situação de Hold & Wait  Enquento segura um lock a thread tenta obter outro lock Deadlocks podem ocorrer mas não necessariamente vão ocorrer Deadlocks são possíveis mas não necessariamente prováveis (a probabilidade aumenta de acordo com o # de threads/processadores/cores) Deadlock podem talvez ser temporário caso seja utilizado timeouts nas aquisições de lock
  • 36. Mutexes  Um Mutex é um objeto de Kernel (Sytem.Threading.Mutex)  Suporta timeout em aquisições de lock  Nomeável, permite sincronização cross-process na mesma maquina  Habilita o uso múltipla aquisições de lock com de deadlock-free via WaitHandle.WaitAll  Tradeoffs  Chamadas de aquisições e liberação de locks sempre ocorrem em kernel mode  Objetos de kernel devem ser fechados assim que não mais necessários (ocorre automaticamente mas depende do GC)
  • 37. Código propicio a deadlock
  • 39. Semaphore  Funciona de forma similar ao Monitor ou Mutex, porem ele delimita quantas threads podem acessar uma sessão critica ao mesmo tempo.  É como uma balada como uma fila, aonde as pessoas na fila esperam uma pessoa sair da balada para entrar.  System.Threading.SemaphoreSlim é mais leve, não faz chamdas de kernel, para ser usado em apenas um processo.  System.Threading.Semaphore pode ser nomeado e funciona entre processos  Não tem garantia de ordem
  • 41. ReaderWriterLockSlim  Possui trem modos : Read, Write e Ungradeable  Muitas threads podem estar simutaneamente em modo Read  Apenas uma pode entrar em modo Ungradeable mas outras threads podem entrar em modo read  Apenas uma Thread pode entrar em modo write, e nenhuma outra thread pode adquirir um lock
  • 43. Immutable Collections  NuGet System.Collection.Immutable  Thread Safe por definição
  • 44. Keyword : volatile  Não reordena instruções na memoria  “Garante” que a leitura do valor mais novo será realizada  Resolvia o problema de double null check em versões do .NET < 2  Deve ser evitado  Apenas utilizado em casos em que o cenario de locks não esta atendendo a performance desejada
  • 45. E o TPL? Async await?  IMPORTANTE: Assíncrono não é equivalente a paralelo.  A classe Task ou ValueTask não necessariamente estão vinculadas com threads.  O Método estático Task.Run() ou Task.Factory.StartNew() sempre inicia uma thread, e é a forma recomendada para se criar threads no .NET moderno.  Mais sobre isso na proxima, sobre .NET Assincrono