fork download
  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. }
Success #stdin #stdout 0.03s 36904KB
stdin
Standard input is empty
stdout
=== Contador con Errores ===

Cuenta total (no sincronizado): 0


=== Contador con Sincronización ===

Cuenta total (sincronizado): 0