[{"data":1,"prerenderedAt":963},["ShallowReactive",2],{"navigation_docs":3,"-ejemplos-ejemplo-08":298,"-ejemplos-ejemplo-08-surround":958},[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":246,"body":300,"description":951,"extension":952,"links":953,"meta":954,"navigation":955,"path":247,"seo":956,"stem":248,"__hash__":957},"docs\u002F7.ejemplos\u002F08.ejemplo-08.md",{"type":301,"value":302,"toc":947},"minimark",[303,307,312,315,319,322,330,580,587,594,724,733,740,928,943],[304,305,306],"p",{},"En este ejemplo, se presentará un caso práctico de cómo utilizar semáforos en Java para controlar el acceso a recursos compartidos en un entorno concurrente.",[308,309,311],"h2",{"id":310},"descripción-del-problema","Descripción del problema",[304,313,314],{},"Supongamos que tenemos un recurso compartido, como una impresora, que solo puede ser utilizada por un hilo a la vez. Si varios hilos intentan acceder a la impresora simultáneamente, podríamos tener una condición de carrera que podría llevar a resultados impredecibles. Para evitar esto, podemos utilizar un semáforo para controlar el acceso a la impresora.",[308,316,318],{"id":317},"solución-con-semáforos","Solución con semáforos",[304,320,321],{},"En este ejemplo, se utilizará un semáforo para controlar el acceso a la impresora. El semáforo se inicializará con un permiso, lo que significa que solo un hilo podrá acceder a la impresora al mismo tiempo.",[304,323,324,325,329],{},"Por consiguiente, lo primero es crear la clase ",[326,327,328],"code",{},"Printer"," que representará la impresora compartida:",[331,332,337],"pre",{"className":333,"code":334,"language":335,"meta":336,"style":336},"language-java shiki shiki-themes github-dark","public class Printer {\n    private Semaphore semaphore;\n\n    public Printer(Semaphore semaphore) {\n        this.semaphore = semaphore;\n    }\n\n    public void print(String document) {\n        try {\n            \u002F\u002F Adquirir un permiso del semáforo\n            semaphore.acquire();\n            System.out.println(\"Printing: \" + document);\n            Thread.sleep(2000); \u002F\u002F Simular tiempo de impresión\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        } finally {\n            \u002F\u002F Liberar el permiso del semáforo\n            semaphore.release();\n        }\n    }   \n}\n","java","",[326,338,339,359,368,375,393,409,415,420,439,447,454,466,488,508,525,536,546,552,562,568,574],{"__ignoreMap":336},[340,341,344,348,351,355],"span",{"class":342,"line":343},"line",1,[340,345,347],{"class":346},"snl16","public",[340,349,350],{"class":346}," class",[340,352,354],{"class":353},"svObZ"," Printer",[340,356,358],{"class":357},"s95oV"," {\n",[340,360,362,365],{"class":342,"line":361},2,[340,363,364],{"class":346},"    private",[340,366,367],{"class":357}," Semaphore semaphore;\n",[340,369,371],{"class":342,"line":370},3,[340,372,374],{"emptyLinePlaceholder":373},true,"\n",[340,376,378,381,383,386,390],{"class":342,"line":377},4,[340,379,380],{"class":346},"    public",[340,382,354],{"class":353},[340,384,385],{"class":357},"(Semaphore ",[340,387,389],{"class":388},"s9osk","semaphore",[340,391,392],{"class":357},") {\n",[340,394,396,400,403,406],{"class":342,"line":395},5,[340,397,399],{"class":398},"sDLfK","        this",[340,401,402],{"class":357},".semaphore ",[340,404,405],{"class":346},"=",[340,407,408],{"class":357}," semaphore;\n",[340,410,412],{"class":342,"line":411},6,[340,413,414],{"class":357},"    }\n",[340,416,418],{"class":342,"line":417},7,[340,419,374],{"emptyLinePlaceholder":373},[340,421,423,425,428,431,434,437],{"class":342,"line":422},8,[340,424,380],{"class":346},[340,426,427],{"class":346}," void",[340,429,430],{"class":353}," print",[340,432,433],{"class":357},"(String ",[340,435,436],{"class":388},"document",[340,438,392],{"class":357},[340,440,442,445],{"class":342,"line":441},9,[340,443,444],{"class":346},"        try",[340,446,358],{"class":357},[340,448,450],{"class":342,"line":449},10,[340,451,453],{"class":452},"sAwPA","            \u002F\u002F Adquirir un permiso del semáforo\n",[340,455,457,460,463],{"class":342,"line":456},11,[340,458,459],{"class":357},"            semaphore.",[340,461,462],{"class":353},"acquire",[340,464,465],{"class":357},"();\n",[340,467,469,472,475,478,482,485],{"class":342,"line":468},12,[340,470,471],{"class":357},"            System.out.",[340,473,474],{"class":353},"println",[340,476,477],{"class":357},"(",[340,479,481],{"class":480},"sU2Wk","\"Printing: \"",[340,483,484],{"class":346}," +",[340,486,487],{"class":357}," document);\n",[340,489,491,494,497,499,502,505],{"class":342,"line":490},13,[340,492,493],{"class":357},"            Thread.",[340,495,496],{"class":353},"sleep",[340,498,477],{"class":357},[340,500,501],{"class":398},"2000",[340,503,504],{"class":357},"); ",[340,506,507],{"class":452},"\u002F\u002F Simular tiempo de impresión\n",[340,509,511,514,517,520,523],{"class":342,"line":510},14,[340,512,513],{"class":357},"        } ",[340,515,516],{"class":346},"catch",[340,518,519],{"class":357}," (InterruptedException ",[340,521,522],{"class":388},"e",[340,524,392],{"class":357},[340,526,528,531,534],{"class":342,"line":527},15,[340,529,530],{"class":357},"            e.",[340,532,533],{"class":353},"printStackTrace",[340,535,465],{"class":357},[340,537,539,541,544],{"class":342,"line":538},16,[340,540,513],{"class":357},[340,542,543],{"class":346},"finally",[340,545,358],{"class":357},[340,547,549],{"class":342,"line":548},17,[340,550,551],{"class":452},"            \u002F\u002F Liberar el permiso del semáforo\n",[340,553,555,557,560],{"class":342,"line":554},18,[340,556,459],{"class":357},[340,558,559],{"class":353},"release",[340,561,465],{"class":357},[340,563,565],{"class":342,"line":564},19,[340,566,567],{"class":357},"        }\n",[340,569,571],{"class":342,"line":570},20,[340,572,573],{"class":357},"    }   \n",[340,575,577],{"class":342,"line":576},21,[340,578,579],{"class":357},"}\n",[304,581,582,583,586],{},"En esta clase, el método ",[326,584,585],{},"print()"," adquiere un permiso del semáforo antes de imprimir el documento y lo libera después de completar la impresión.",[304,588,589,590,593],{},"A continuación, se creará la clase ",[326,591,592],{},"Worker"," que representará a los hilos que intentarán acceder a la impresora:",[331,595,597],{"className":333,"code":596,"language":335,"meta":336,"style":336},"public class Worker implements Runnable {\n    private Printer printer;\n    private String document;\n\n    public Worker(Printer printer, String document) {\n        this.printer = printer;\n        this.document = document;\n    }\n\n    @Override\n    public void run() {\n        printer.print(document);\n    }   \n}\n",[326,598,599,616,623,630,634,653,665,677,681,685,693,705,716,720],{"__ignoreMap":336},[340,600,601,603,605,608,611,614],{"class":342,"line":343},[340,602,347],{"class":346},[340,604,350],{"class":346},[340,606,607],{"class":353}," Worker",[340,609,610],{"class":346}," implements",[340,612,613],{"class":353}," Runnable",[340,615,358],{"class":357},[340,617,618,620],{"class":342,"line":361},[340,619,364],{"class":346},[340,621,622],{"class":357}," Printer printer;\n",[340,624,625,627],{"class":342,"line":370},[340,626,364],{"class":346},[340,628,629],{"class":357}," String document;\n",[340,631,632],{"class":342,"line":377},[340,633,374],{"emptyLinePlaceholder":373},[340,635,636,638,640,643,646,649,651],{"class":342,"line":395},[340,637,380],{"class":346},[340,639,607],{"class":353},[340,641,642],{"class":357},"(Printer ",[340,644,645],{"class":388},"printer",[340,647,648],{"class":357},", String ",[340,650,436],{"class":388},[340,652,392],{"class":357},[340,654,655,657,660,662],{"class":342,"line":411},[340,656,399],{"class":398},[340,658,659],{"class":357},".printer ",[340,661,405],{"class":346},[340,663,664],{"class":357}," printer;\n",[340,666,667,669,672,674],{"class":342,"line":417},[340,668,399],{"class":398},[340,670,671],{"class":357},".document ",[340,673,405],{"class":346},[340,675,676],{"class":357}," document;\n",[340,678,679],{"class":342,"line":422},[340,680,414],{"class":357},[340,682,683],{"class":342,"line":441},[340,684,374],{"emptyLinePlaceholder":373},[340,686,687,690],{"class":342,"line":449},[340,688,689],{"class":357},"    @",[340,691,692],{"class":346},"Override\n",[340,694,695,697,699,702],{"class":342,"line":456},[340,696,380],{"class":346},[340,698,427],{"class":346},[340,700,701],{"class":353}," run",[340,703,704],{"class":357},"() {\n",[340,706,707,710,713],{"class":342,"line":468},[340,708,709],{"class":357},"        printer.",[340,711,712],{"class":353},"print",[340,714,715],{"class":357},"(document);\n",[340,717,718],{"class":342,"line":490},[340,719,573],{"class":357},[340,721,722],{"class":342,"line":510},[340,723,579],{"class":357},[304,725,582,726,729,730,732],{},[326,727,728],{},"run()"," llama al método ",[326,731,585],{}," de la impresora para imprimir el documento.",[304,734,735,736,739],{},"Finalmente, se creará la clase ",[326,737,738],{},"Main"," para iniciar los hilos y probar el control de acceso a la impresora:",[331,741,743],{"className":333,"code":742,"language":335,"meta":336,"style":336},"import java.util.concurrent.Semaphore;\nimport java.lang.Thread;\n\nvoid main(){\n    Semaphore semaphore = new Semaphore(1); \u002F\u002F Permitir solo un hilo a la vez\n    Printer printer = new Printer(semaphore);\n\n    Thread worker1 = new Thread(new Worker(printer, \"Document 1\"));\n    Thread worker2 = new Thread(new Worker(printer, \"Document 2\"));\n    Thread worker3 = new Thread(new Worker(printer, \"Document 3\"));\n\n    worker1.start();\n    worker2.start();\n    worker3.start();\n}\n",[326,744,745,753,760,764,775,798,812,816,844,868,892,896,906,915,924],{"__ignoreMap":336},[340,746,747,750],{"class":342,"line":343},[340,748,749],{"class":346},"import",[340,751,752],{"class":357}," java.util.concurrent.Semaphore;\n",[340,754,755,757],{"class":342,"line":361},[340,756,749],{"class":346},[340,758,759],{"class":357}," java.lang.Thread;\n",[340,761,762],{"class":342,"line":370},[340,763,374],{"emptyLinePlaceholder":373},[340,765,766,769,772],{"class":342,"line":377},[340,767,768],{"class":346},"void",[340,770,771],{"class":353}," main",[340,773,774],{"class":357},"(){\n",[340,776,777,780,782,785,788,790,793,795],{"class":342,"line":395},[340,778,779],{"class":357},"    Semaphore semaphore ",[340,781,405],{"class":346},[340,783,784],{"class":346}," new",[340,786,787],{"class":353}," Semaphore",[340,789,477],{"class":357},[340,791,792],{"class":398},"1",[340,794,504],{"class":357},[340,796,797],{"class":452},"\u002F\u002F Permitir solo un hilo a la vez\n",[340,799,800,803,805,807,809],{"class":342,"line":411},[340,801,802],{"class":357},"    Printer printer ",[340,804,405],{"class":346},[340,806,784],{"class":346},[340,808,354],{"class":353},[340,810,811],{"class":357},"(semaphore);\n",[340,813,814],{"class":342,"line":417},[340,815,374],{"emptyLinePlaceholder":373},[340,817,818,821,823,825,828,830,833,835,838,841],{"class":342,"line":422},[340,819,820],{"class":357},"    Thread worker1 ",[340,822,405],{"class":346},[340,824,784],{"class":346},[340,826,827],{"class":353}," Thread",[340,829,477],{"class":357},[340,831,832],{"class":346},"new",[340,834,607],{"class":353},[340,836,837],{"class":357},"(printer, ",[340,839,840],{"class":480},"\"Document 1\"",[340,842,843],{"class":357},"));\n",[340,845,846,849,851,853,855,857,859,861,863,866],{"class":342,"line":441},[340,847,848],{"class":357},"    Thread worker2 ",[340,850,405],{"class":346},[340,852,784],{"class":346},[340,854,827],{"class":353},[340,856,477],{"class":357},[340,858,832],{"class":346},[340,860,607],{"class":353},[340,862,837],{"class":357},[340,864,865],{"class":480},"\"Document 2\"",[340,867,843],{"class":357},[340,869,870,873,875,877,879,881,883,885,887,890],{"class":342,"line":449},[340,871,872],{"class":357},"    Thread worker3 ",[340,874,405],{"class":346},[340,876,784],{"class":346},[340,878,827],{"class":353},[340,880,477],{"class":357},[340,882,832],{"class":346},[340,884,607],{"class":353},[340,886,837],{"class":357},[340,888,889],{"class":480},"\"Document 3\"",[340,891,843],{"class":357},[340,893,894],{"class":342,"line":456},[340,895,374],{"emptyLinePlaceholder":373},[340,897,898,901,904],{"class":342,"line":468},[340,899,900],{"class":357},"    worker1.",[340,902,903],{"class":353},"start",[340,905,465],{"class":357},[340,907,908,911,913],{"class":342,"line":490},[340,909,910],{"class":357},"    worker2.",[340,912,903],{"class":353},[340,914,465],{"class":357},[340,916,917,920,922],{"class":342,"line":510},[340,918,919],{"class":357},"    worker3.",[340,921,903],{"class":353},[340,923,465],{"class":357},[340,925,926],{"class":342,"line":527},[340,927,579],{"class":357},[304,929,930,931,934,935,938,939,942],{},"En este ejemplo, se crea un semáforo con un permiso, lo que significa que solo un hilo podrá acceder a la impresora al mismo tiempo. Al iniciar los hilos ",[326,932,933],{},"worker1",", ",[326,936,937],{},"worker2"," y ",[326,940,941],{},"worker3",", cada uno intentará imprimir su documento, pero solo uno de ellos podrá acceder a la impresora a la vez, garantizando así la sincronización entre los hilos y evitando condiciones de carrera.",[944,945,946],"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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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":336,"searchDepth":361,"depth":361,"links":948},[949,950],{"id":310,"depth":361,"text":311},{"id":317,"depth":361,"text":318},"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.","md",null,{"editButton":104},{"icon":83},{"title":246,"description":951},"76GXxxMFm4uBNPkA74GkMnKPKNRfvoN_aBBo1Ygomqk",[959,961],{"title":242,"path":243,"stem":244,"description":960,"icon":83,"children":-1},"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.",{"title":250,"path":251,"stem":252,"description":962,"icon":83,"children":-1},"En este ejemplo se muestra cómo un restaurante maneja los pedidos de los clientes utilizando un sistema de colas. Se explicará cómo se procesan los pedidos, cómo se asignan a los cocineros y cómo se asegura que los clientes reciban sus pedidos de manera eficiente.",1775101376295]