/* Page prose (es) */
"OneTaskAtATime" = "# Un actor deja entrar una tarea a la vez\n\nPrimero, el problema una vez más. Aquí está la forma del error del capítulo [Riesgos de la concurrencia](Concurrency%20Hazards.playgroundchapter/Overview), en su forma más simple. Una clase a secas contiene un saldo, y muchos depósitos concurrentes compiten sobre él:\n\n```swift\nfinal class UnsafeLedger {\n    var balance = 0\n\n    func deposit(_ amount: Int) {\n        balance += amount   // read, add, write (not atomic)\n    }\n}\n```\n\nEse `balance += amount` es en realidad *tres* pasos: leer el valor actual, sumarle, escribirlo de vuelta. Si dos tareas leen `0` al mismo tiempo, ambas escriben `1`, y un depósito se pierde. Ejecuta mil depósitos concurrentes y rara vez obtienes `1000`.\n\nEn Swift 6, si de verdad intentas compartir ese `UnsafeLedger` entre tareas concurrentes, **el compilador te detiene**: una clase mutable a secas no es segura de compartir, así que no compilará. Ese es el compilador señalándote la herramienta correcta. La herramienta es un actor.\n\nUn **actor** es un tipo de referencia, como una clase, cuyo estado mutable solo puede ser tocado por **una tarea a la vez**. El actor serializa cada acceso a su propio estado, así que el leer-sumar-escribir de arriba nunca puede solaparse. Cambia `class` por `actor` (y, ya que estamos apretando las cosas, marca `balance` como `private(set)` para que solo los métodos del propio actor puedan cambiarlo; el código externo aún puede leerlo):\n\n```swift\nactor Ledger {\n    private(set) var balance = 0\n\n    func deposit(_ amount: Int) {\n        balance += amount\n    }\n}\n```\n\nEse es todo el arreglo. Las llamadas a `deposit` ahora están automáticamente serializadas: mientras una tarea está dentro de `deposit`, cualquier otra tarea tiene que esperar su turno. Sin cola que configurar, nada que recordar. Machaquémoslo con mil depósitos concurrentes usando un grupo de tareas (del capítulo [Grupos de tareas](Task%20Groups.playgroundchapter/Overview)).";
"OneTaskAtATime-2" = "**Míralo en acción:** el saldo final es **`1000`. Siempre.** Ejecútalo una y otra vez; nunca se desvía. Los mil depósitos aterrizaron todos. Compáralo con la versión de clase, que pierde actualizaciones de forma impredecible. El actor convirtió una carrera en una garantía, y no escribiste ni un solo cerrojo.\n\n* callout(Pruébalo): Sube el bucle a `1...10_000` depósitos. ¿El saldo final sigue saliendo exactamente correcto en cada ejecución?\n\n> Esto difiere del arreglo con cola serial de antes en el libro. Allí *elegías* enrutar cada acceso a través de una cola, y nada te obligaba a ser consistente; un solo acceso directo despistado reintroducía la carrera. Un actor hace que esa protección sea parte del tipo. No hay forma de alcanzar `balance` que se salte la serialización, y el compilador lo comprueba por ti.\n\n[Anterior](@previous)  |  página 2 de 7  |  [Siguiente: Aislamiento de actor](@next)";
