首页 > Asp.net开发 > C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】

C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】

今天主要介绍下C#的两种锁:互斥锁(lock)和读写锁(ReadWriteLock)

互斥锁(lock)

lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。当任何一个线程获取到锁后,其他线程如果需要使用该临界区内代码,则必须等待前一个线程使用完毕后释放锁。

代码示例:

 

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. Object thisLock = new Object();
  2. lock (thisLock)
  3. {
  4.     // 临界区代码块
  5. }

读写锁(ReadWriteLock)

 

ReadWriteLock定义支持单个写线程和多个读线程的锁。该锁的作用主要是解决并发读的性能问题,使用该锁,可以大大提高数据并发访问的性能,只有在写时,才会阻塞所有的读锁。

示例代码:

 

[csharp]  
  1. using System.Collections.Generic;
  2. using System.Windows;
  3. using System.Threading;
  4. namespace Test
  5. {
  6.     public partial class MainWindow : Window
  7.     {
  8.         List<int> list = new List<int>();
  9.         private ReaderWriterLock _rwlock = new ReaderWriterLock();
  10.         public MainWindow()
  11.         {
  12.             InitializeComponent();
  13.             Thread ThRead = new Thread(new ThreadStart(Read));
  14.             ThRead.IsBackground = true;
  15.             Thread ThWrite = new Thread(new ThreadStart(Write));
  16.             ThWrite.IsBackground = true;
  17.             ThRead.Start();
  18.             ThWrite.Start();
  19.         }
  20.         int ReadCount = 0;//读取次数
  21.         int WriteCount = 0;//写次数
  22.         private void Read()
  23.         {
  24.             while (true)
  25.             {
  26.                 //使用一个 System.Int32 超时值获取读线程锁。
  27.                 _rwlock.AcquireReaderLock(100);
  28.                 try
  29.                 {
  30.                     if (list.Count > 0)
  31.                     {
  32.                         int result = list[list.Count - 1];
  33.                         ReadCount++;
  34.                     }
  35.                 }
  36.                 finally
  37.                 {
  38.                     //减少锁计数,释放锁
  39.                     _rwlock.ReleaseReaderLock();
  40.                 }
  41.             }
  42.         }
  43.         private void Write()
  44.         {
  45.             while (true)
  46.             {
  47.                 //使用一个 System.Int32 超时值获取写线程锁。
  48.                 _rwlock.AcquireWriterLock(100);
  49.                 try
  50.                 {
  51.                     list.Add(WriteCount++);
  52.                 }
  53.                 finally
  54.                 {
  55.                     //减少写线程锁上的锁计数,释放写锁
  56.                     _rwlock.ReleaseWriterLock();
  57.                 }
  58.             }
  59.         }
  60.     }
  61. }

本文固定链接: http://www.devba.com/index.php/archives/4511.html | 开发吧

报歉!评论已关闭.