• 多线程中锁的使用


    本文转自:http://www.2cto.com/kf/201401/274446.html

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

    互斥锁(lock)

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

    代码示例:

    Object thisLock = new Object();
    lock (thisLock)
    {
    // 临界区代码块
    }

    读写锁(ReadWriteLock)

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


    示例代码:

    using System.Collections.Generic;
    using System.Windows;
    using System.Threading;
    
    
    namespace FYSTest
    {
      public partial class MainWindow : Window
      {
        List list = new List();
        private ReaderWriterLock _rwlock = new ReaderWriterLock();
    
        public MainWindow()
        {
          InitializeComponent();
          Thread ThRead = new Thread(new ThreadStart(Read));
          ThRead.IsBackground = true;
          Thread ThRead2 = new Thread(new ThreadStart(Read));
          ThRead2.IsBackground = true;
          Thread ThWrite = new Thread(new ThreadStart(Write));
          ThWrite.IsBackground = true;
          ThRead.Start();
          ThRead2.Start();
          ThWrite.Start();
        }
    
        private void Read()
        {
          while (true)
          {
            //使用一个 System.Int32 超时值获取读线程锁。
            _rwlock.AcquireReaderLock(100);
            try
            {
              if (list.Count > 0)
              {
                int result = list[list.Count - 1];
              }
            }
            finally
            {
              //减少锁计数,释放锁
              _rwlock.ReleaseReaderLock();
            }
          }
        }
    
        int WriteCount = 0;//写次数
        private void Write()
        {
          while (true)
          {
            //使用一个 System.Int32 超时值获取写线程锁。
            _rwlock.AcquireWriterLock(100);
            try
            {
              list.Add(WriteCount++);
            }
            finally
            {
              //减少写线程锁上的锁计数,释放写锁
              _rwlock.ReleaseWriterLock();
            }
          }
        }
      }
    }
  • 相关阅读:
    政务公开系统专栏首页的跨站攻击漏洞
    Spring+XFire WSSecurity安全认证开发感悟
    Appfuse使用中遇到的问题及解决方案
    How to get the rowid when insert the data to Oracle database
    How to configure CVS in IntelliJ IDEA
    localhost打不开 127.0.0.1可以打开,,,或 hosts 文件不起作用的解决方法
    ASp.net中Froms验证方式
    ASP.NET 页面执行顺序详解
    【转】防止用户通过后退按钮重复提交表单ASP中的response.Buffer,Response.Expires,Response.CacheControl
    页面事件(Init,Load,PreRender)执行顺序__简单总结
  • 原文地址:https://www.cnblogs.com/yi-ye/p/5583057.html
Copyright © 2020-2023  润新知