using System; using System.Threading; namespace Recetas.Multithreading.Cap04.R0109 { public sealed class PruebaContador { public static void Main() { Console.Title = "No-Sincronizado vs Sincronizado"; Console.WriteLine (); Console.WriteLine ("=== Contador con Errores ==="); // Crea un ContadorBasico: ContadorBasico c = new ContadorBasico(); // Crea 3 threads: Thread t1 = new Thread(() => ProbarContador(c)); Thread t2 = new Thread(() => ProbarContador(c)); Thread t3 = new Thread(() => ProbarContador(c)); // Inicio de ejecución de los threads: t1.Start(); t2.Start(); t3.Start(); // Espera a que finalicen: t1.Join(); t2.Join(); t3.Join(); Console.WriteLine ("\nCuenta total (no sincronizado): {0}\n\n", c.Cuenta.ToString()); Console.WriteLine ("=== Contador con Sincronización ==="); // Crea una instancia de ContadorSincronizado: ContadorSincronizado cs = new ContadorSincronizado(); t1 = new Thread(() => ProbarContador(cs)); t2 = new Thread(() => ProbarContador(cs)); t3 = new Thread(() => ProbarContador(cs)); // Inicio de ejecución de los threads: t1.Start(); t2.Start(); t3.Start(); // Espera a que finalicen: t1.Join(); t2.Join(); t3.Join(); Console.WriteLine ("\nCuenta total (sincronizado): {0}\n\n", cs.Cuenta.ToString()); } private static void ProbarContador(ContadorAbstracto c) { for (int i = 0; i < 10000; ++i) { c.Incrementar(); c.Decrementar(); } } } public abstract class ContadorAbstracto { public abstract void Incrementar(); public abstract void Decrementar(); } // Clase que representa un contador sin sincronización: public class ContadorBasico : ContadorAbstracto { public int Cuenta { get; private set; } public override void Incrementar() { ++Cuenta; } public override void Decrementar() { --Cuenta; } } // Clase que representa un contador con sincronización: public class ContadorSincronizado : ContadorAbstracto { private readonly Object bloqueo = new Object(); public int Cuenta { get; private set; } public override void Incrementar() { lock (bloqueo) { ++Cuenta; } } public override void Decrementar() { lock (bloqueo) { --Cuenta; } } } }