{"id":2155,"date":"2025-08-27T10:30:00","date_gmt":"2025-08-27T10:30:00","guid":{"rendered":"https:\/\/mugnos-it.com\/?p=2155"},"modified":"2025-08-05T12:02:46","modified_gmt":"2025-08-05T12:02:46","slug":"race-condition","status":"publish","type":"post","link":"https:\/\/mugnos-it.com\/pt\/race-condition\/","title":{"rendered":"Race Condition"},"content":{"rendered":"<h1 class=\"wp-block-heading\">O Inimigo Oculto da Concorr\u00eancia!<\/h1>\n\n\n\n<p>\ud83d\udc4b Fala, galera!<\/p>\n\n\n\n<p>Imagine que voc\u00ea implementou um sistema bonitinho, testado, com m\u00e9tricas no ar, deploy redondo\u2026 tudo certo. At\u00e9 que, do nada, come\u00e7a a aparecer um bug esquisito. Inconsist\u00eancias de dados, valores errados, comportamentos aleat\u00f3rios. E, no meio da investiga\u00e7\u00e3o, algu\u00e9m solta aquele diagn\u00f3stico misterioso:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201cAh\u2026 isso a\u00ed deve ser Race Condition.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>Parece nome de vil\u00e3o da Marvel, n\u00e9? Mas na real, Race Condition \u00e9 um dos erros mais trai\u00e7oeiros em sistemas concorrentes \u2014 justamente por ser dif\u00edcil de reproduzir, dif\u00edcil de explicar e, muitas vezes, ignorado at\u00e9 estourar de vez.<\/p>\n\n\n\n<p>J\u00e1 passei pro isso algumas vezes, algumas vezes eu n\u00e3o tinha detalhes suficientes para entender se realmente era um caso de \u201crace condition\u201d mesmo, teve casos que eu realmente presenciei ele acontecendo com meu c\u00f3digo e outras vezes que na verdade o termo foi usado para justificar algo que n\u00e3o tinha rela\u00e7\u00e3o nenhuma com race condition\u2026<\/p>\n\n\n\n<p>Ent\u00e3o bora entender o que realmente est\u00e1 por tr\u00e1s desse problema, por que ele acontece e o mais importante: como evitar esse caos silencioso e n\u00e3o passar vergonha falando coisa errada .<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u2192 O Que \u00c9 Race Condition?<\/h2>\n\n\n\n<p>Em termos simples, Race Condition \u00e9 o que acontece quando dois ou mais processos tentam acessar ou modificar o mesmo recurso ao mesmo tempo, e a ordem de execu\u00e7\u00e3o impacta diretamente no resultado final.<\/p>\n\n\n\n<p>\u00c9 uma corrida. S\u00f3 que, diferente da F\u00f3rmula 1, aqui ningu\u00e9m avisa quem vai largar primeiro \u2014 e quem perde \u00e9 o seu sistema.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"515\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/image-61-1024x515.png\" alt=\"\" class=\"wp-image-2169\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/image-61-1024x515.png 1024w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/image-61-300x151.png 300w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/image-61-768x386.png 768w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/image-61-1536x772.png 1536w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/image-61-2048x1030.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Um exemplo real e comum:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Duas threads leem o valor de uma vari\u00e1vel global <code>y = 5<\/code>;<\/li>\n\n\n\n<li>A primeira quer somar <code>1<\/code>, a segunda quer multiplicar por <code>2<\/code>;<\/li>\n\n\n\n<li>A segunda escreve <code>10<\/code> antes;<\/li>\n\n\n\n<li>A primeira, achando que ainda era <code>5<\/code>, soma <code>1<\/code> e sobrescreve <code>6<\/code> no final.<\/li>\n<\/ol>\n\n\n\n<p>Resultado esperado: 11. Resultado real: 6. Cl\u00e1ssico Race Condition.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2192 Quando Pode Acontecer?<\/h2>\n\n\n\n<p>Muita gente acha que Race Condition \u00e9 um \u201cproblema de thread\u201d. Mas n\u00e3o \u00e9 s\u00f3 isso.<\/p>\n\n\n\n<p>Ele pode acontecer em qualquer situa\u00e7\u00e3o com <strong>concorr\u00eancia e estado compartilhado<\/strong>, por exemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Threads paralelas acessando a mesma vari\u00e1vel ao mesmo tempo. Cl\u00e1ssico.<\/li>\n\n\n\n<li>V\u00e1rios pods atualizando um valor em cache (tipo Redis) sem atomicidade.<\/li>\n\n\n\n<li>Microsservi\u00e7os diferentes escrevendo na mesma base de dados simultaneamente.<\/li>\n\n\n\n<li>Bancos sem isolamento transacional permitindo sobrescritas silenciosas.<\/li>\n\n\n\n<li>Escritas concorrentes em arquivos, contadores globais ou estados compartilhados.<\/li>\n<\/ul>\n\n\n\n<p>E o mais trai\u00e7oeiro: ele n\u00e3o d\u00e1 erro.<\/p>\n\n\n\n<p>Ele s\u00f3&#8230; d\u00e1 errado.<\/p>\n\n\n\n<p>E quando voc\u00ea percebe, o estrago j\u00e1 foi. \ud83d\ude2c<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u2192 Como Evitar esse Caos?<\/h2>\n\n\n\n<p>Ok, ok, n\u00e3o vou falar s\u00f3 do problema.. Segue aqui algumas formas de voc\u00ea evitar que o race condition aconteca de forma eficaz.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mutex \/ Lock<\/strong> Impe\u00e7a o acesso simult\u00e2neo a recursos com <em>locks<\/em>. Exemplo: ao inv\u00e9s de deixar duas threads editarem a vari\u00e1vel, use um <code>mutex<\/code> para garantir que apenas uma por vez consiga acessar. \ud83d\udca1 Ideal pra quando voc\u00ea realmente precisa editar um valor compartilhado.<\/li>\n\n\n\n<li><strong>Fila + Worker<\/strong><\/li>\n<\/ol>\n\n\n\n<p>Ao inv\u00e9s de editar diretamente, jogue todas as requisi\u00e7\u00f5es para uma fila interna, e um \u00fanico processo (ou thread) processa as mensagens uma a uma.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udca1 Estrat\u00e9gia \u00f3tima para incrementos, contadores ou qualquer opera\u00e7\u00e3o repetida.<\/p>\n<\/blockquote>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Atomicidade<\/strong> Aqui a ideia \u00e9 simples: <strong>ou tudo acontece, ou nada acontece<\/strong>. Seja via transa\u00e7\u00e3o no banco, comandos at\u00f4micos em cache (<code>INCR<\/code>, <code>SETNX<\/code>), ou l\u00f3gica na aplica\u00e7\u00e3o com controle de estado. \ud83d\udca1 \u00datil quando v\u00e1rias opera\u00e7\u00f5es dependem de consist\u00eancia total em um \u00fanico recurso.<\/li>\n\n\n\n<li><strong>Leader Election \/ Flags de execu\u00e7\u00e3o<\/strong> Antes de atualizar algo, a aplica\u00e7\u00e3o verifica se &#8220;tem permiss\u00e3o&#8221; para isso. Pode ser uma flag na mem\u00f3ria, uma verifica\u00e7\u00e3o de estado ou at\u00e9 um algoritmo de elei\u00e7\u00e3o de l\u00edder. \ud83d\udca1 \u00datil quando m\u00faltiplos processos querem disputar um mesmo recurso. Ex Maquina de estado.<\/li>\n<\/ol>\n\n\n\n<p><strong>IMPORTANTE: Cada cen\u00e1rio pode exigir uma ou mais dessas estrat\u00e9gias. O importante \u00e9 sempre se perguntar:<em>\u201cEsse recurso pode ser acessado ao mesmo tempo por mais de um processo?\u201d<\/em> Se sim, previna antes de escalar.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o:<\/h2>\n\n\n\n<p>Race Condition nem sempre \u00e9 um <a href=\"http:\/\/bug.Na\">bug.Na<\/a> maioria das vezes, \u00e9 um <strong>d\u00e9<\/strong>bito t\u00e9cnico que a gente deixa escapar na hora de implementar \u2014 por falta de aten\u00e7\u00e3o ao fluxo real da concorr\u00eancia.<\/p>\n\n\n\n<p>Por isso, mais do que aplicar <code>mutex<\/code>, filas ou atomicidade, \u00e9 essencial entender de verdade o que o c\u00f3digo est\u00e1 fazendo e quais caminhos de execu\u00e7\u00e3o podem ocorrer em paralelo. Sem esse entendimento, a gente s\u00f3 empurra o problema pra frente.<\/p>\n\n\n\n<p>E o cen\u00e1rio hoje n\u00e3o ajuda: ambientes distribu\u00eddos est\u00e3o cada vez mais presentes. A gente sabe que precisa \u201cdividir para conquistar\u201d, mas, quanto mais divide, maior o risco de concorr\u00eancia mal resolvida.<\/p>\n\n\n\n<p>O que era raro num sistema monol\u00edtico centralizado, agora pode acontecer em qualquer servi\u00e7o, pod, thread ou evento ass\u00edncrono.<\/p>\n\n\n\n<p>Enfim\u2026 Se quiser aprofundar ainda mais esse tipo de conhecimento e se tornar uma refer\u00eancia em arquitetura de sistemas, vem com a gente na Comunidade de Arquitetura Descomplicada (CaD).<\/p>\n\n\n\n<p>Por aqui a gente estuda, discute e aplica os padr\u00f5es que fazem diferen\u00e7a de verdade na pr\u00e1tica \u2014 seja voc\u00ea dev, tech lead ou arquiteto.<\/p>\n\n\n\n<p>\ud83d\udc49 Saiba mais em: <a href=\"https:\/\/mugnos-it.com\/pt\/cad\/\">https:\/\/mugnos-it.com\/cad<\/a><\/p>\n\n\n\n<p>Abra\u00e7os.<\/p>\n\n\n\n<p>Douglas Mugnos<\/p>\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>O Inimigo Oculto da Concorr\u00eancia! \ud83d\udc4b Fala, galera! Imagine que voc\u00ea implementou um sistema bonitinho, testado, com m\u00e9tricas no ar, deploy redondo\u2026 tudo certo. At\u00e9 que, do nada, come\u00e7a a aparecer um bug esquisito. Inconsist\u00eancias de dados, valores errados, comportamentos aleat\u00f3rios. E, no meio da investiga\u00e7\u00e3o, algu\u00e9m solta aquele diagn\u00f3stico misterioso: \u201cAh\u2026 isso a\u00ed deve [&hellip;]<\/p>","protected":false},"author":3,"featured_media":2157,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2155","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/ChatGPT-Image-4-de-ago.-de-2025-09_10_39.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/comments?post=2155"}],"version-history":[{"count":5,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2155\/revisions"}],"predecessor-version":[{"id":2171,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2155\/revisions\/2171"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media\/2157"}],"wp:attachment":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media?parent=2155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/categories?post=2155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/tags?post=2155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}