Usando sincronizado - 1

"Olá, amigo!"

"Sim, estou aqui, estou aqui."

"Hoje, vou falar sobre como usar o sincronizado na prática."

"Quando um programa tem muitos objetos e threads, geralmente acontece que vários threads trabalham com o mesmo objeto simultaneamente. Ao fazer isso, os threads interferem uns nos outros."

"Sim, eu já sei disso."

"Então, digamos que você tenha um objeto sendo acessado por vários threads. Você pode fazer duas coisas para evitar problemas."

"A primeira é usar blocos sincronizados para agrupar todos os locais onde o objeto é acessado. Mas essa abordagem pode não funcionar se algum programador escrever um código que acesse o objeto diretamente, sem um bloco sincronizado."

"Portanto, uma segunda abordagem é usada na maioria das vezes - tornando o objeto thread-safe." "Em outras palavras, o mecanismo sincronizado é embutido no próprio objeto: ele declara seus métodos sincronizados e/ou envolve o código dentro de seus métodos em blocos sincronizados."

"Portanto, qualquer objeto que eu possa usar de vários threads, e isso é quase todos os objetos do programa, tenho que torná-lo thread-safe?"

"Em geral, sim. Na realidade, nem todos os objetos em um programa são usados ​​por threads diferentes, mas geralmente há muitos. Então, quando você começa a escrever código para um thread e acessa vários objetos dele, então com cada chamada de método você deve se perguntar: «Esta chamada é segura?»"

"Seguro?"

"Thread-safe, o que significa que pode ser chamado com segurança de vários threads."

"Aqui estão alguns exemplos. Suponha que você tenha um objeto String que é acessado de diferentes threads. Como você já deve se lembrar, String é imutável - assim como todos os outros tipos primitivos. Isso significa que um objeto não muda depois de criado . Isso significa que é impossível "quebrar" tal objeto. Todos os objetos imutáveis ​​são thread-safe."

"Bem, isso torna as coisas mais fáceis."

"Agora, suponha que você precise de uma string mutável."

"Sim, eu me lembro. Existem dois tipos de strings: StringBuffer e StringBuilder. StringBuffer é como StringBuilder, mas todos os seus métodos são sincronizados. Também é thread-safe?"

"Sim. Se você precisar acessar um objeto StringBuilder de vários threads, deverá substituí-lo por um StringBuffer. Caso contrário, mais cedo ou mais tarde, os threads irão alterá-lo ao mesmo tempo e "quebrá-lo".

"E se o objeto que está sendo acessado de diferentes threads for um objeto de minha própria classe? Preciso adicionar sincronizado a seus métodos neste caso também?"

"Sim. É melhor seguir esta regra: todos os objetos que serão acessados ​​de diferentes threads devem ser thread-safe."

"Entendo. Não pensei que tudo fosse tão sério. Obrigada, Ellie."

"De nada. Espero que essas dicas ajudem você quando Diego lhe der algumas de suas tarefas fáceis. ☺"