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;
}
}
}
}