using System; using System.Collections; using System.Threading; namespace Recetas.CSharp.R0414 { public sealed class lockColecciones { // Instancia `Object` para el bloqueo concurrente: private static Object objBloqueante = new Object(); // Lista contenedora de cadenas: private static ArrayList listaCadenas = new ArrayList(); // Contador acceso lista: private static int contadorAcceso = 0; public static void Main() { Console.Title = "Demostración Acceso Concurrente en Colecciones"; Console.WriteLine (); // Agregación de cadenas al objeto `listaCadenas`: listaCadenas.Add ("Experiencias"); listaCadenas.Add ("Construcción"); listaCadenas.Add ("Software"); listaCadenas.Add ("xCSw"); // Crea 10 instancias de `Thread` para acceder y leer el contenido del // objeto ArrayList: for (int i = 1; i <= 10; ++i) { Thread t = new Thread( AccederLista ); t.Name = String.Format ("Thread-{0}", i.ToString()); t.Start(); } } public static void AccederLista() { lock (objBloqueante) { Console.WriteLine ("El thread `{0}` accedió al elemento `{1}`.", Thread.CurrentThread.Name, listaCadenas[contadorAcceso%4] ); Thread.Sleep (1000); ++contadorAcceso; } } } }