Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Multithreading.Cap04.R0109
  5. {
  6.     public sealed class PruebaContador
  7.     {
  8.         public static void Main()
  9.         {
  10.             Console.Title = "No-Sincronizado vs Sincronizado";
  11.             Console.WriteLine ();
  12.            
  13.             Console.WriteLine ("=== Contador con Errores ===");
  14.            
  15.             // Crea un ContadorBasico:
  16.             ContadorBasico c = new ContadorBasico();
  17.            
  18.             // Crea 3 threads:
  19.             Thread t1 = new Thread(() => ProbarContador(c));
  20.             Thread t2 = new Thread(() => ProbarContador(c));
  21.             Thread t3 = new Thread(() => ProbarContador(c));
  22.            
  23.             // Inicio de ejecución de los threads:
  24.             t1.Start();
  25.             t2.Start();
  26.             t3.Start();
  27.            
  28.             // Espera a que finalicen:
  29.             t1.Join();
  30.             t2.Join();
  31.             t3.Join();
  32.            
  33.             Console.WriteLine ("\nCuenta total (no sincronizado): {0}\n\n", c.Cuenta.ToString());
  34.            
  35.             Console.WriteLine ("=== Contador con Sincronización ===");
  36.            
  37.             // Crea una instancia de ContadorSincronizado:
  38.             ContadorSincronizado cs = new ContadorSincronizado();
  39.            
  40.             t1 = new Thread(() => ProbarContador(cs));
  41.             t2 = new Thread(() => ProbarContador(cs));
  42.             t3 = new Thread(() => ProbarContador(cs));
  43.            
  44.             // Inicio de ejecución de los threads:
  45.             t1.Start();
  46.             t2.Start();
  47.             t3.Start();
  48.            
  49.             // Espera a que finalicen:
  50.             t1.Join();
  51.             t2.Join();
  52.             t3.Join();
  53.            
  54.             Console.WriteLine ("\nCuenta total (sincronizado): {0}\n\n", cs.Cuenta.ToString());
  55.         }
  56.        
  57.         private static void ProbarContador(ContadorAbstracto c)
  58.         {
  59.             for (int i = 0; i < 10000; ++i)
  60.             {
  61.                 c.Incrementar();
  62.                 c.Decrementar();
  63.             }
  64.         }
  65.     }
  66.  
  67.     public abstract class ContadorAbstracto
  68.     {
  69.         public abstract void Incrementar();
  70.         public abstract void Decrementar();
  71.     }
  72.    
  73.     // Clase que representa un contador sin sincronización:
  74.     public class ContadorBasico : ContadorAbstracto
  75.     {
  76.         public int Cuenta
  77.         {
  78.             get;
  79.             private set;
  80.         }
  81.        
  82.         public override void Incrementar()
  83.         {
  84.             ++Cuenta;
  85.         }
  86.        
  87.         public override void Decrementar()
  88.         {
  89.             --Cuenta;
  90.         }
  91.     }
  92.    
  93.     // Clase que representa un contador con sincronización:
  94.     public class ContadorSincronizado : ContadorAbstracto
  95.     {
  96.         private readonly Object bloqueo = new Object();
  97.        
  98.         public int Cuenta
  99.         {
  100.             get;
  101.             private set;
  102.         }
  103.        
  104.         public override void Incrementar()
  105.         {
  106.             lock (bloqueo)
  107.             {
  108.                 ++Cuenta;
  109.             }
  110.         }
  111.        
  112.         public override void Decrementar()
  113.         {
  114.             lock (bloqueo)
  115.             {
  116.                 --Cuenta;
  117.             }
  118.         }
  119.     }
  120. }