[{"data":1,"prerenderedAt":1195},["ShallowReactive",2],{"navigation_docs":3,"-ejemplos-ejemplo-07":298,"-ejemplos-ejemplo-07-surround":1190},[4,18,70,105,149,178,212,257],{"title":5,"path":6,"stem":7,"children":8,"icon":17},"Evaluación","\u002Fintroduction","1.introduction\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"icon":11},"Método de Evaluación","i-iconamoon-cheque-bold",{"title":13,"path":14,"stem":15,"icon":16},"Plataforma de Aprendizaje","\u002Fintroduction\u002Fplataforma","1.introduction\u002F2.plataforma","i-lucide-book-marked","i-lucide-house",{"title":19,"path":20,"stem":21,"children":22,"icon":25},"Interfaz Gráfica de Usuario","\u002Fgui","2.gui\u002F01.index",[23,26,30,34,38,42,46,50,54,58,62,66],{"title":24,"path":20,"stem":21,"icon":25},"¿Qué es una Interfaz Gráfica de Usuario (GUI)?","i-carbon-gui-management",{"title":27,"path":28,"stem":29,"icon":25},"Creación de Interfaces Gráficas de Usuario (GUI)","\u002Fgui\u002Fbuild-gui","2.gui\u002F02.build-gui",{"title":31,"path":32,"stem":33,"icon":25},"Componentes Básicos de Swing","\u002Fgui\u002Fcomponentes-basicos","2.gui\u002F03.componentes-basicos",{"title":35,"path":36,"stem":37},"El componente JFrame","\u002Fgui\u002Fjframe","2.gui\u002F04.jframe",{"title":39,"path":40,"stem":41},"El componente JPanel","\u002Fgui\u002Fjpanel","2.gui\u002F05.jpanel",{"title":43,"path":44,"stem":45},"El componente JButton","\u002Fgui\u002Fjbutton","2.gui\u002F06.jbutton",{"title":47,"path":48,"stem":49,"icon":25},"Elementos de texto en interfaces gráficas con Swing","\u002Fgui\u002Ftext","2.gui\u002F07.text",{"title":51,"path":52,"stem":53},"Elementos Visuales","\u002Fgui\u002Felementos-visuales","2.gui\u002F08.elementos-visuales",{"title":55,"path":56,"stem":57,"icon":25},"Eventos en Swing","\u002Fgui\u002Feventos","2.gui\u002F09.eventos",{"title":59,"path":60,"stem":61,"icon":25},"Controles en Swing","\u002Fgui\u002Fcontroles","2.gui\u002F10.controles",{"title":63,"path":64,"stem":65,"icon":25},"Atributos Comunes de los Componentes de Diseño","\u002Fgui\u002Fatributos-comunes","2.gui\u002F11.atributos-comunes",{"title":67,"path":68,"stem":69,"icon":25},"Layouts","\u002Fgui\u002Flayout","2.gui\u002F12.layout",{"title":71,"icon":25,"path":72,"stem":73,"children":74,"page":104},"Personalización","\u002Fpersonalizacion","3.personalizacion",[75,79,84,88,92,96,100],{"title":76,"path":77,"stem":78},"Jerarquía de clases en Swing","\u002Fpersonalizacion\u002Fjerarquia","3.personalizacion\u002F01.jerarquia",{"title":80,"path":81,"stem":82,"icon":83},"Personalización Inicial de Componentes Swing","\u002Fpersonalizacion\u002Fpersonalizacion-inicial","3.personalizacion\u002F02.personalizacion-inicial","i-carbon-palette",{"title":85,"path":86,"stem":87,"icon":83},"Tema y Personalización Avanzada en Swing","\u002Fpersonalizacion\u002Ftheme","3.personalizacion\u002F03.theme",{"title":89,"path":90,"stem":91,"icon":83},"Pintando en Swing","\u002Fpersonalizacion\u002Fpaint","3.personalizacion\u002F04.paint",{"title":93,"path":94,"stem":95,"icon":83},"Mi Tema 1: Comenzando con la Personalización","\u002Fpersonalizacion\u002Ftheme-start","3.personalizacion\u002F05.theme-start",{"title":97,"path":98,"stem":99,"icon":83},"UI Delegates: Personalizando la Apariencia de los Componentes","\u002Fpersonalizacion\u002Fui-delegates","3.personalizacion\u002F06.ui-delegates",{"title":101,"path":102,"stem":103,"icon":83},"Empleado delegadores de UI para personalizar la apariencia de los componentes","\u002Fpersonalizacion\u002Ftheme-02","3.personalizacion\u002F07.theme-02",false,{"title":106,"path":107,"stem":108,"children":109,"icon":148},"Programación concurrente","\u002Fconcurrencia","4.concurrencia\u002F01.index",[110,112,116,120,124,128,132,136,140,144],{"title":111,"path":107,"stem":108,"icon":83},"¿Qué es la concurrencia?",{"title":113,"path":114,"stem":115,"icon":83},"Unidades de Ejecución","\u002Fconcurrencia\u002Funidades-ejecucion","4.concurrencia\u002F02.unidades-ejecucion",{"title":117,"path":118,"stem":119,"icon":83},"Programa de flujo único y de flujo múltiple","\u002Fconcurrencia\u002Fflujos","4.concurrencia\u002F03.flujos",{"title":121,"path":122,"stem":123,"icon":83},"Hilos con Thread y Runnable","\u002Fconcurrencia\u002Fthread-runnable","4.concurrencia\u002F04.thread-runnable",{"title":125,"path":126,"stem":127},"Paralelismo V.S. Concurrencia","\u002Fconcurrencia\u002Fparalelismo","4.concurrencia\u002F05.paralelismo",{"title":129,"path":130,"stem":131,"icon":83},"Problemas clásicos de concurrencia","\u002Fconcurrencia\u002Fproblemas","4.concurrencia\u002F06.problemas",{"title":133,"path":134,"stem":135,"icon":83},"Emulando condiciones de carrera en Java","\u002Fconcurrencia\u002Fcondiciones-carrera","4.concurrencia\u002F07.condiciones-carrera",{"title":137,"path":138,"stem":139,"icon":83},"Semáforos en Java","\u002Fconcurrencia\u002Fsemaforos","4.concurrencia\u002F08.semaforos",{"title":141,"path":142,"stem":143,"icon":83},"La clase Timer en Java Swing","\u002Fconcurrencia\u002Ftimer","4.concurrencia\u002F09.timer",{"title":145,"path":146,"stem":147,"icon":83},"Algoritmos de ordenamiento de procesos","\u002Fconcurrencia\u002Falgoritmos-procesos","4.concurrencia\u002F10.algoritmos-procesos","i-carbon-parallel-groups",{"title":150,"path":151,"stem":152,"children":153,"icon":177},"Acceso a datos","\u002Fdatos","5.datos\u002F01.index",[154,157,161,165,169,173],{"title":155,"path":151,"stem":152,"icon":156},"Java y las bases de datos","i-carbon-database",{"title":158,"path":159,"stem":160},"Cliente Servidor","\u002Fdatos\u002Fcliente-servidor","5.datos\u002F02.cliente-servidor",{"title":162,"path":163,"stem":164},"CRUD","\u002Fdatos\u002Fcrud","5.datos\u002F03.crud",{"title":166,"path":167,"stem":168},"Sentencias Preparadas con JDBC","\u002Fdatos\u002Fsentencia-preparada","5.datos\u002F04.sentencia-preparada",{"title":170,"path":171,"stem":172},"DAO (Data Access Object)","\u002Fdatos\u002Fdao","5.datos\u002F05.dao",{"title":174,"path":175,"stem":176},"Usando Hibernate ORM","\u002Fdatos\u002Form","5.datos\u002F06.orm","i-gravity-ui-database-fill",{"title":179,"path":180,"stem":181,"children":182,"icon":211},"Programación móvil","\u002Fmovil","6.movil\u002F01.index",[183,186,191,195,199,203,207],{"title":184,"path":180,"stem":181,"icon":185},"¿Qué es Android y Kotlin?","i-carbon-mobile",{"title":187,"path":188,"stem":189,"icon":190},"¿Qué es Android Studio?","\u002Fmovil\u002Fandroid-studio","6.movil\u002F02.android-studio","i-carbon-application",{"title":192,"path":193,"stem":194,"icon":190},"¿Qué es Jetpack Compose?","\u002Fmovil\u002Fjetpack-compose","6.movil\u002F03.jetpack-compose",{"title":196,"path":197,"stem":198},"Filas y Columnas con Jetpack Compose","\u002Fmovil\u002Ffilas-columnas","6.movil\u002F04.filas-columnas",{"title":200,"path":201,"stem":202,"icon":190},"Componentes Básicos en Jetpack Compose","\u002Fmovil\u002Fcomponentes-basicos","6.movil\u002F05.componentes-basicos",{"title":204,"path":205,"stem":206,"icon":190},"Las Intenciones en Android con Jetpack Compose","\u002Fmovil\u002Fintentions","6.movil\u002F06.intentions",{"title":208,"path":209,"stem":210,"icon":190},"Navegación en Android con Jetpack Compose","\u002Fmovil\u002Fnavegacion","6.movil\u002F07.navegacion","phone_android",{"title":213,"icon":25,"path":214,"stem":215,"children":216,"page":104},"Ejemplos","\u002Fejemplos","7.ejemplos",[217,221,225,229,233,237,241,245,249,253],{"title":218,"path":219,"stem":220},"Ejemplo 01: Creando un validador abstracto de expresiones","\u002Fejemplos\u002Fejemplo-01","7.ejemplos\u002F01.ejemplo-01",{"title":222,"path":223,"stem":224},"Ejemplo 02: Diferencias de validar un JTextField y un JFormattedTextField","\u002Fejemplos\u002Fejemplo-02","7.ejemplos\u002F02.ejemplo-02",{"title":226,"path":227,"stem":228},"Ejemplo 03: Creando una Aplicación con GUI en Java Swing","\u002Fejemplos\u002Fejemplo-03","7.ejemplos\u002F03.ejemplo-03",{"title":230,"path":231,"stem":232},"Ejemplo 4: Estilizando componentes Swing con Delegadores","\u002Fejemplos\u002Fejemplo-04","7.ejemplos\u002F04.ejemplo-04",{"title":234,"path":235,"stem":236,"icon":83},"Ejemplo 5: Uso de Hilos con Thread y Runnable","\u002Fejemplos\u002Fejemplo-05","7.ejemplos\u002F05.ejemplo-05",{"title":238,"path":239,"stem":240,"icon":83},"Ejemplo 06: Manejando Hilos de formas Diferentes en Java","\u002Fejemplos\u002Fejemplo-06","7.ejemplos\u002F06.ejemplo-06",{"title":242,"path":243,"stem":244,"icon":83},"Ejemplo 7: Condiciones de carrera en Java","\u002Fejemplos\u002Fejemplo-07","7.ejemplos\u002F07.ejemplo-07",{"title":246,"path":247,"stem":248,"icon":83},"Ejemplo 8: Control de acceso a recursos compartidos con semáforos","\u002Fejemplos\u002Fejemplo-08","7.ejemplos\u002F08.ejemplo-08",{"title":250,"path":251,"stem":252,"icon":83},"Ejemplo 9: El restaurante y los pedidos","\u002Fejemplos\u002Fejemplo-09","7.ejemplos\u002F09.ejemplo-09",{"title":254,"path":255,"stem":256},"Ejemplo 10: Proceso FIFO (First In, First Out) con Semáforos y Swing","\u002Fejemplos\u002Fejemplo-10","7.ejemplos\u002F10.ejemplo-10",{"title":258,"icon":25,"path":259,"stem":260,"children":261,"page":104},"Actividades","\u002Factividades","8.actividades",[262,266,270,274,278,282,286,290,294],{"title":263,"path":264,"stem":265,"icon":25},"Actividad 1: Introducción al diseño de interfaces","\u002Factividades\u002Fact-01","8.actividades\u002F01.act-01",{"title":267,"path":268,"stem":269,"icon":25},"Actividad 2: Diseño de wireframes y prototipos","\u002Factividades\u002Fact-02","8.actividades\u002F02.act-02",{"title":271,"path":272,"stem":273,"icon":25},"Actividad 3: Propuesta de Proyecto y Wireframe inicial","\u002Factividades\u002Fact-03","8.actividades\u002F03.act-03",{"title":275,"path":276,"stem":277,"icon":83},"Actividad 4: Temas y Componentes Personalizados en Swing","\u002Factividades\u002Fact-04","8.actividades\u002F04.act-04",{"title":279,"path":280,"stem":281,"icon":83},"Actividad 5: Explicando la Concurrencia a un Niño de 5 Años","\u002Factividades\u002Fact-05","8.actividades\u002F05.act-05",{"title":283,"path":284,"stem":285,"icon":83},"Actividad 6: Simulación de una cocina con múltiples chefs (hilos)","\u002Factividades\u002Fact-06","8.actividades\u002F06.act-06",{"title":287,"path":288,"stem":289,"icon":83},"Actividad 7: Sistema de retiro bancario","\u002Factividades\u002Fact-07","8.actividades\u002F07.act-07",{"title":291,"path":292,"stem":293,"icon":83},"Actividad 8: Simulación de Round Robin con hilos e Interfaz Gráfica","\u002Factividades\u002Fact-08","8.actividades\u002F08.act-08",{"title":295,"path":296,"stem":297,"icon":83},"Actividad 9: CRUD con Hibernate y Swing","\u002Factividades\u002Fact-09","8.actividades\u002F09.act-09",{"id":299,"title":242,"body":300,"description":306,"extension":1184,"links":1185,"meta":1186,"navigation":1187,"path":243,"seo":1188,"stem":244,"__hash__":1189},"docs\u002F7.ejemplos\u002F07.ejemplo-07.md",{"type":301,"value":302,"toc":1175},"minimark",[303,307,312,324,328,333,648,652,901,917,921,1149,1158,1162,1171],[304,305,306],"p",{},"En este artículo recrearemos una condición de carrera en Java utilizando un ejemplo práctico para ilustrar el concepto y las consecuencias de las condiciones de carrera en la programación concurrente.",[308,309,311],"h2",{"id":310},"descripción-del-problema","Descripción del problema",[304,313,314,315,319,320,323],{},"Supongamos que tienes una clase ",[316,317,318],"code",{},"Product"," que representa un producto en una tienda en línea. Esta clase tiene un método ",[316,321,322],{},"decreaseStock()"," que reduce el stock del producto en una cantidad específica. Si varios clientes intentan comprar el mismo producto al mismo tiempo, podrían ocurrir condiciones de carrera que resulten en un stock negativo o en la venta de más productos de los disponibles.",[308,325,327],{"id":326},"ejemplo-de-código","Ejemplo de código",[329,330,332],"h3",{"id":331},"clase-product","Clase Product",[334,335,340],"pre",{"className":336,"code":337,"language":338,"meta":339,"style":339},"language-java shiki shiki-themes github-dark","public class Product {\n    private String name;\n    private int stock;\n\n    public Product(String name, int stock) {\n        this.name = name;\n        this.stock = stock;\n    }\n\n    public void decreaseStock(int quantity) {\n        if (stock >= quantity) {\n            stock -= quantity;\n            IO.println(\"Stock decreased by \" + quantity + \". Remaining stock: \" + stock);\n        } else {\n            IO.println(\"Not enough stock to decrease by \" + quantity + \". Remaining stock: \" + stock);\n        }\n    }\n\n    public int getStock() {\n        return stock;\n    }\n\n    public String getName() {\n        return name;\n    }\n}\n","java","",[316,341,342,362,371,382,389,416,432,444,450,455,476,491,503,535,546,570,576,581,586,599,607,612,617,630,637,642],{"__ignoreMap":339},[343,344,347,351,354,358],"span",{"class":345,"line":346},"line",1,[343,348,350],{"class":349},"snl16","public",[343,352,353],{"class":349}," class",[343,355,357],{"class":356},"svObZ"," Product",[343,359,361],{"class":360},"s95oV"," {\n",[343,363,365,368],{"class":345,"line":364},2,[343,366,367],{"class":349},"    private",[343,369,370],{"class":360}," String name;\n",[343,372,374,376,379],{"class":345,"line":373},3,[343,375,367],{"class":349},[343,377,378],{"class":349}," int",[343,380,381],{"class":360}," stock;\n",[343,383,385],{"class":345,"line":384},4,[343,386,388],{"emptyLinePlaceholder":387},true,"\n",[343,390,392,395,397,400,404,407,410,413],{"class":345,"line":391},5,[343,393,394],{"class":349},"    public",[343,396,357],{"class":356},[343,398,399],{"class":360},"(String ",[343,401,403],{"class":402},"s9osk","name",[343,405,406],{"class":360},", ",[343,408,409],{"class":349},"int",[343,411,412],{"class":402}," stock",[343,414,415],{"class":360},") {\n",[343,417,419,423,426,429],{"class":345,"line":418},6,[343,420,422],{"class":421},"sDLfK","        this",[343,424,425],{"class":360},".name ",[343,427,428],{"class":349},"=",[343,430,431],{"class":360}," name;\n",[343,433,435,437,440,442],{"class":345,"line":434},7,[343,436,422],{"class":421},[343,438,439],{"class":360},".stock ",[343,441,428],{"class":349},[343,443,381],{"class":360},[343,445,447],{"class":345,"line":446},8,[343,448,449],{"class":360},"    }\n",[343,451,453],{"class":345,"line":452},9,[343,454,388],{"emptyLinePlaceholder":387},[343,456,458,460,463,466,469,471,474],{"class":345,"line":457},10,[343,459,394],{"class":349},[343,461,462],{"class":349}," void",[343,464,465],{"class":356}," decreaseStock",[343,467,468],{"class":360},"(",[343,470,409],{"class":349},[343,472,473],{"class":402}," quantity",[343,475,415],{"class":360},[343,477,479,482,485,488],{"class":345,"line":478},11,[343,480,481],{"class":349},"        if",[343,483,484],{"class":360}," (stock ",[343,486,487],{"class":349},">=",[343,489,490],{"class":360}," quantity) {\n",[343,492,494,497,500],{"class":345,"line":493},12,[343,495,496],{"class":360},"            stock ",[343,498,499],{"class":349},"-=",[343,501,502],{"class":360}," quantity;\n",[343,504,506,509,512,514,518,521,524,527,530,532],{"class":345,"line":505},13,[343,507,508],{"class":360},"            IO.",[343,510,511],{"class":356},"println",[343,513,468],{"class":360},[343,515,517],{"class":516},"sU2Wk","\"Stock decreased by \"",[343,519,520],{"class":349}," +",[343,522,523],{"class":360}," quantity ",[343,525,526],{"class":349},"+",[343,528,529],{"class":516}," \". Remaining stock: \"",[343,531,520],{"class":349},[343,533,534],{"class":360}," stock);\n",[343,536,538,541,544],{"class":345,"line":537},14,[343,539,540],{"class":360},"        } ",[343,542,543],{"class":349},"else",[343,545,361],{"class":360},[343,547,549,551,553,555,558,560,562,564,566,568],{"class":345,"line":548},15,[343,550,508],{"class":360},[343,552,511],{"class":356},[343,554,468],{"class":360},[343,556,557],{"class":516},"\"Not enough stock to decrease by \"",[343,559,520],{"class":349},[343,561,523],{"class":360},[343,563,526],{"class":349},[343,565,529],{"class":516},[343,567,520],{"class":349},[343,569,534],{"class":360},[343,571,573],{"class":345,"line":572},16,[343,574,575],{"class":360},"        }\n",[343,577,579],{"class":345,"line":578},17,[343,580,449],{"class":360},[343,582,584],{"class":345,"line":583},18,[343,585,388],{"emptyLinePlaceholder":387},[343,587,589,591,593,596],{"class":345,"line":588},19,[343,590,394],{"class":349},[343,592,378],{"class":349},[343,594,595],{"class":356}," getStock",[343,597,598],{"class":360},"() {\n",[343,600,602,605],{"class":345,"line":601},20,[343,603,604],{"class":349},"        return",[343,606,381],{"class":360},[343,608,610],{"class":345,"line":609},21,[343,611,449],{"class":360},[343,613,615],{"class":345,"line":614},22,[343,616,388],{"emptyLinePlaceholder":387},[343,618,620,622,625,628],{"class":345,"line":619},23,[343,621,394],{"class":349},[343,623,624],{"class":360}," String ",[343,626,627],{"class":356},"getName",[343,629,598],{"class":360},[343,631,633,635],{"class":345,"line":632},24,[343,634,604],{"class":349},[343,636,431],{"class":360},[343,638,640],{"class":345,"line":639},25,[343,641,449],{"class":360},[343,643,645],{"class":345,"line":644},26,[343,646,647],{"class":360},"}\n",[329,649,651],{"id":650},"simulación-de-condiciones-de-carrera","Simulación de condiciones de carrera",[334,653,655],{"className":336,"code":654,"language":338,"meta":339,"style":339},"public class RaceConditionExample {\n    void main() throws InterruptedException {\n        Product product = new Product(\"Laptop\", 10);\n\n        Runnable purchaseTask = () -> {\n            for (int i = 0; i \u003C 5; i++) {\n                product.decreaseStock(1);\n            }\n        };\n\n        Thread thread1 = new Thread(purchaseTask);\n        Thread thread2 = new Thread(purchaseTask);\n\n        thread1.start();\n        thread2.start();\n\n        thread1.join();\n        thread2.join();\n\n        IO.println(\"Final stock: \" + product.getStock());\n    }\n}\n",[316,656,657,668,685,710,714,729,764,779,784,789,793,808,821,825,836,845,849,858,866,870,893,897],{"__ignoreMap":339},[343,658,659,661,663,666],{"class":345,"line":346},[343,660,350],{"class":349},[343,662,353],{"class":349},[343,664,665],{"class":356}," RaceConditionExample",[343,667,361],{"class":360},[343,669,670,673,676,679,682],{"class":345,"line":364},[343,671,672],{"class":349},"    void",[343,674,675],{"class":356}," main",[343,677,678],{"class":360},"() ",[343,680,681],{"class":349},"throws",[343,683,684],{"class":360}," InterruptedException {\n",[343,686,687,690,692,695,697,699,702,704,707],{"class":345,"line":373},[343,688,689],{"class":360},"        Product product ",[343,691,428],{"class":349},[343,693,694],{"class":349}," new",[343,696,357],{"class":356},[343,698,468],{"class":360},[343,700,701],{"class":516},"\"Laptop\"",[343,703,406],{"class":360},[343,705,706],{"class":421},"10",[343,708,709],{"class":360},");\n",[343,711,712],{"class":345,"line":384},[343,713,388],{"emptyLinePlaceholder":387},[343,715,716,719,721,724,727],{"class":345,"line":391},[343,717,718],{"class":360},"        Runnable purchaseTask ",[343,720,428],{"class":349},[343,722,723],{"class":360}," () ",[343,725,726],{"class":349},"->",[343,728,361],{"class":360},[343,730,731,734,737,739,742,744,747,750,753,756,759,762],{"class":345,"line":418},[343,732,733],{"class":349},"            for",[343,735,736],{"class":360}," (",[343,738,409],{"class":349},[343,740,741],{"class":360}," i ",[343,743,428],{"class":349},[343,745,746],{"class":421}," 0",[343,748,749],{"class":360},"; i ",[343,751,752],{"class":349},"\u003C",[343,754,755],{"class":421}," 5",[343,757,758],{"class":360},"; i",[343,760,761],{"class":349},"++",[343,763,415],{"class":360},[343,765,766,769,772,774,777],{"class":345,"line":434},[343,767,768],{"class":360},"                product.",[343,770,771],{"class":356},"decreaseStock",[343,773,468],{"class":360},[343,775,776],{"class":421},"1",[343,778,709],{"class":360},[343,780,781],{"class":345,"line":446},[343,782,783],{"class":360},"            }\n",[343,785,786],{"class":345,"line":452},[343,787,788],{"class":360},"        };\n",[343,790,791],{"class":345,"line":457},[343,792,388],{"emptyLinePlaceholder":387},[343,794,795,798,800,802,805],{"class":345,"line":478},[343,796,797],{"class":360},"        Thread thread1 ",[343,799,428],{"class":349},[343,801,694],{"class":349},[343,803,804],{"class":356}," Thread",[343,806,807],{"class":360},"(purchaseTask);\n",[343,809,810,813,815,817,819],{"class":345,"line":493},[343,811,812],{"class":360},"        Thread thread2 ",[343,814,428],{"class":349},[343,816,694],{"class":349},[343,818,804],{"class":356},[343,820,807],{"class":360},[343,822,823],{"class":345,"line":505},[343,824,388],{"emptyLinePlaceholder":387},[343,826,827,830,833],{"class":345,"line":537},[343,828,829],{"class":360},"        thread1.",[343,831,832],{"class":356},"start",[343,834,835],{"class":360},"();\n",[343,837,838,841,843],{"class":345,"line":548},[343,839,840],{"class":360},"        thread2.",[343,842,832],{"class":356},[343,844,835],{"class":360},[343,846,847],{"class":345,"line":572},[343,848,388],{"emptyLinePlaceholder":387},[343,850,851,853,856],{"class":345,"line":578},[343,852,829],{"class":360},[343,854,855],{"class":356},"join",[343,857,835],{"class":360},[343,859,860,862,864],{"class":345,"line":583},[343,861,840],{"class":360},[343,863,855],{"class":356},[343,865,835],{"class":360},[343,867,868],{"class":345,"line":588},[343,869,388],{"emptyLinePlaceholder":387},[343,871,872,875,877,879,882,884,887,890],{"class":345,"line":601},[343,873,874],{"class":360},"        IO.",[343,876,511],{"class":356},[343,878,468],{"class":360},[343,880,881],{"class":516},"\"Final stock: \"",[343,883,520],{"class":349},[343,885,886],{"class":360}," product.",[343,888,889],{"class":356},"getStock",[343,891,892],{"class":360},"());\n",[343,894,895],{"class":345,"line":609},[343,896,449],{"class":360},[343,898,899],{"class":345,"line":614},[343,900,647],{"class":360},[304,902,903,904,906,907,909,910,913,914,916],{},"En este ejemplo, hemos creado una clase ",[316,905,318],{}," con un método ",[316,908,322],{}," que reduce el stock del producto. Luego, en la clase ",[316,911,912],{},"RaceConditionExample",", hemos simulado dos hilos que intentan comprar el mismo producto al mismo tiempo, lo que puede resultar en una condición de carrera. Debido a la falta de sincronización en el método ",[316,915,322],{},", es posible que el resultado final no sea el esperado, y el stock podría llegar a ser negativo o mostrar un número incorrecto de productos restantes.",[308,918,920],{"id":919},"clase-product-con-sincronización","Clase Product con sincronización",[334,922,924],{"className":336,"code":923,"language":338,"meta":339,"style":339},"public class Product {\n    private String name;\n    private int stock;\n\n    public Product(String name, int stock) {\n        this.name = name;\n        this.stock = stock;\n    }\n\n    public synchronized void decreaseStock(int quantity) {\n        if (stock >= quantity) {\n            stock -= quantity;\n            IO.println(\"Stock decreased by \" + quantity + \". Remaining stock: \" + stock);\n        } else {\n            IO.println(\"Not enough stock to decrease by \" + quantity + \". Remaining stock: \" + stock);\n        }\n    }\n\n    public int getStock() {\n        return stock;\n    }\n\n    public String getName() {\n        return name;\n    }\n}\n",[316,925,926,936,942,950,954,972,982,992,996,1000,1019,1029,1037,1059,1067,1089,1093,1097,1101,1111,1117,1121,1125,1135,1141,1145],{"__ignoreMap":339},[343,927,928,930,932,934],{"class":345,"line":346},[343,929,350],{"class":349},[343,931,353],{"class":349},[343,933,357],{"class":356},[343,935,361],{"class":360},[343,937,938,940],{"class":345,"line":364},[343,939,367],{"class":349},[343,941,370],{"class":360},[343,943,944,946,948],{"class":345,"line":373},[343,945,367],{"class":349},[343,947,378],{"class":349},[343,949,381],{"class":360},[343,951,952],{"class":345,"line":384},[343,953,388],{"emptyLinePlaceholder":387},[343,955,956,958,960,962,964,966,968,970],{"class":345,"line":391},[343,957,394],{"class":349},[343,959,357],{"class":356},[343,961,399],{"class":360},[343,963,403],{"class":402},[343,965,406],{"class":360},[343,967,409],{"class":349},[343,969,412],{"class":402},[343,971,415],{"class":360},[343,973,974,976,978,980],{"class":345,"line":418},[343,975,422],{"class":421},[343,977,425],{"class":360},[343,979,428],{"class":349},[343,981,431],{"class":360},[343,983,984,986,988,990],{"class":345,"line":434},[343,985,422],{"class":421},[343,987,439],{"class":360},[343,989,428],{"class":349},[343,991,381],{"class":360},[343,993,994],{"class":345,"line":446},[343,995,449],{"class":360},[343,997,998],{"class":345,"line":452},[343,999,388],{"emptyLinePlaceholder":387},[343,1001,1002,1004,1007,1009,1011,1013,1015,1017],{"class":345,"line":457},[343,1003,394],{"class":349},[343,1005,1006],{"class":349}," synchronized",[343,1008,462],{"class":349},[343,1010,465],{"class":356},[343,1012,468],{"class":360},[343,1014,409],{"class":349},[343,1016,473],{"class":402},[343,1018,415],{"class":360},[343,1020,1021,1023,1025,1027],{"class":345,"line":478},[343,1022,481],{"class":349},[343,1024,484],{"class":360},[343,1026,487],{"class":349},[343,1028,490],{"class":360},[343,1030,1031,1033,1035],{"class":345,"line":493},[343,1032,496],{"class":360},[343,1034,499],{"class":349},[343,1036,502],{"class":360},[343,1038,1039,1041,1043,1045,1047,1049,1051,1053,1055,1057],{"class":345,"line":505},[343,1040,508],{"class":360},[343,1042,511],{"class":356},[343,1044,468],{"class":360},[343,1046,517],{"class":516},[343,1048,520],{"class":349},[343,1050,523],{"class":360},[343,1052,526],{"class":349},[343,1054,529],{"class":516},[343,1056,520],{"class":349},[343,1058,534],{"class":360},[343,1060,1061,1063,1065],{"class":345,"line":537},[343,1062,540],{"class":360},[343,1064,543],{"class":349},[343,1066,361],{"class":360},[343,1068,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087],{"class":345,"line":548},[343,1070,508],{"class":360},[343,1072,511],{"class":356},[343,1074,468],{"class":360},[343,1076,557],{"class":516},[343,1078,520],{"class":349},[343,1080,523],{"class":360},[343,1082,526],{"class":349},[343,1084,529],{"class":516},[343,1086,520],{"class":349},[343,1088,534],{"class":360},[343,1090,1091],{"class":345,"line":572},[343,1092,575],{"class":360},[343,1094,1095],{"class":345,"line":578},[343,1096,449],{"class":360},[343,1098,1099],{"class":345,"line":583},[343,1100,388],{"emptyLinePlaceholder":387},[343,1102,1103,1105,1107,1109],{"class":345,"line":588},[343,1104,394],{"class":349},[343,1106,378],{"class":349},[343,1108,595],{"class":356},[343,1110,598],{"class":360},[343,1112,1113,1115],{"class":345,"line":601},[343,1114,604],{"class":349},[343,1116,381],{"class":360},[343,1118,1119],{"class":345,"line":609},[343,1120,449],{"class":360},[343,1122,1123],{"class":345,"line":614},[343,1124,388],{"emptyLinePlaceholder":387},[343,1126,1127,1129,1131,1133],{"class":345,"line":619},[343,1128,394],{"class":349},[343,1130,624],{"class":360},[343,1132,627],{"class":356},[343,1134,598],{"class":360},[343,1136,1137,1139],{"class":345,"line":632},[343,1138,604],{"class":349},[343,1140,431],{"class":360},[343,1142,1143],{"class":345,"line":639},[343,1144,449],{"class":360},[343,1146,1147],{"class":345,"line":644},[343,1148,647],{"class":360},[304,1150,1151,1152,1154,1155,1157],{},"En esta versión de la clase ",[316,1153,318],{},", hemos sincronizado el método ",[316,1156,322],{}," para asegurarnos de que solo un hilo pueda acceder a él a la vez. Esto evita las condiciones de carrera y garantiza que el stock se actualice correctamente, incluso cuando varios hilos intentan comprar el mismo producto simultáneamente.",[308,1159,1161],{"id":1160},"conclusión","Conclusión",[304,1163,1164,1165,1167,1168,1170],{},"En este artículo, hemos recreado una condición de carrera en Java utilizando un ejemplo práctico con una clase ",[316,1166,318],{}," y un método ",[316,1169,322],{},". Hemos demostrado cómo la falta de sincronización puede llevar a resultados impredecibles y cómo la sincronización adecuada puede resolver este problema, garantizando que el stock se actualice correctamente incluso en situaciones concurrentes. Es crucial entender las condiciones de carrera y aplicar las mejores prácticas de sincronización para evitar problemas en la programación concurrente.",[1172,1173,1174],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":339,"searchDepth":364,"depth":364,"links":1176},[1177,1178,1182,1183],{"id":310,"depth":364,"text":311},{"id":326,"depth":364,"text":327,"children":1179},[1180,1181],{"id":331,"depth":373,"text":332},{"id":650,"depth":373,"text":651},{"id":919,"depth":364,"text":920},{"id":1160,"depth":364,"text":1161},"md",null,{"editButton":104},{"icon":83},{"title":242,"description":306},"jAYuvkzcrP_03JNSLCiMm-F13ZEePC789EnZK9_enu0",[1191,1193],{"title":238,"path":239,"stem":240,"description":1192,"icon":83,"children":-1},"En este ejemplo, exploraremos diferentes formas de manejar hilos en Java, incluyendo la creación de hilos utilizando la clase `Thread`, la interfaz `Runnable`, y el uso de las funciones `sleep`, `join` e interrupciones para controlar la ejecución de los hilos.",{"title":246,"path":247,"stem":248,"description":1194,"icon":83,"children":-1},"En este artículo se presentará un ejemplo práctico de cómo utilizar semáforos en Java para controlar el acceso a recursos compartidos en un entorno concurrente, evitando condiciones de carrera y garantizando la sincronización entre hilos.",1775101376153]