在4.0之前如果需要在多线程环境下操作集合类型的对象往往需要额为每种操作添加比较复杂的锁机制才能保证每个线程对资源的访问安全,在4.0的Collection名称空间下面又多了一个新的名称空间Concurrent,在这个名称空间下面增加了几个非常有用的线程安全的类:
BlockingCollection
ConcurrentBag
ConcurrentDictionary
ConcurrentQueue
ConcurrentStack
OrderablePartitioner
Partitioner 提供针对数组、列表和可枚举项的常见分区策略。
Partitioner
通一个简单的例子可以非常容易的来应用这些特性
class Program { static ConcurrentDictionary<int, int> dict = new ConcurrentDictionary<int, int>(); static void Main(string[] args) { for (int i = 0; i < 5; i++) { var thread = new Thread(new ThreadStart(Action)); thread.Start(); } Console.Read(); } static void Action() { var rd = new Random(); for (int i = 0; i < 10; i++) { Thread.Sleep(rd.Next(1, 5)); var k = dict.TryAdd(i, i); Console.WriteLine("Thread {0} add {1} {2}", Thread.CurrentThread.ManagedThreadId, i, ok ? "success" : "fail"); } } }
程序输出如下:
Thread 11 add 0 success
Thread 11 add 1 success
Thread 12 add 0 fail
Thread 13 add 0 fail
Thread 11 add 2 success
Thread 12 add 1 fail
Thread 14 add 0 fail
Thread 12 add 2 fail
Thread 13 add 1 fail
…
从输出结果我们看到在多线程竞争的情况下ConcurrentDictionary能够很好的处理锁竞争的问题。
生产消费模式在多线程中是非常常见的一种模式了,在4.0之前需要一套比较复杂的读写锁来处理处理并发资源竞争的问题,在4.0中借助BlockingCollection
static void Main(string[] args)
{
TestCase.Test();
Console.Read();
}
class TestCase
{
static ConcurrentBag
public static void Test()
{
var produce = new Thread(new ThreadStart(Produce));
var consume = new Thread(new ThreadStart(Consume));
produce.Start();
consume.Start();
}
static void Produce()
{
int index = 0;
while (true)
{
if (_bag.IsEmpty)
{
string productName = "Product " + index.ToString();
_bag.Add(new Product() { Name = productName });
Console.WriteLine("Produce Product {0} ", productName);
index += 1;
}
Thread.Sleep(1000);
}
}
static void Consume()
{
while (true)
{
if (!_bag.IsEmpty)
{
Product item;
if (_bag.TryTake(out item))
{
Console.WriteLine("Consume Product {0} " , item.Name);
}
}
Thread.Sleep(1000);
}
}
}
class Product
{
public string Name { get; set; }
}
程序输出如下:
Consume Product Product 0
Produce Product Product 1
Consume Product Product 1
Produce Product Product 2
Consume Product Product 2
Produce Product Product 3
Consume Product Product 3
Produce Product Product 4
Consume Product Product 4
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-670846/ ,如需转载,请注明出处,否则将追究法律责任。