• c# 线程,同步,锁


    最近在阅读《c#高级编程》 这本书。记录一下关于锁的使用

    大致分为三种方法:

    方法1:使用 lock

    方法2:使用 Interlocked

    方法3:使用 Monitor

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int numTasks = 20;
                var state = new SharedState();
                var tasks = new Task[numTasks];
    
                for (int i = 0; i < numTasks; i++)
                {
                    tasks[i] = Task.Run(() => new Job(state).DoTheJob());
                }
    
                for (int i = 0; i < numTasks; i++)
                {
                    tasks[i].Wait();
                }
                Console.WriteLine("summarized {0}", state.State);
                Console.ReadLine();
            }
        }
    
        public class SharedState
        {
            private int state = 0;
            private object syncRoot = new object();
    
            public int State
            {
                get { return state; }
            }
    
            public int IncrementState()
            {
                //方法1:使用interlocked 
                //return Interlocked.Increment(ref state);
                //方法2:使用lock
                //lock (syncRoot)
                //{
                //    state++;
                //    return state;
                //}
                //方法3:使用Monitor
                Monitor.Enter(syncRoot);
                try
                {
                    state++;
                    return state;
                }
                finally
                {
                    Monitor.Exit(syncRoot);
                }
    
                //Monitor的其他用法:等待超过超时时间就不等了
                //bool lockTaken = false;
                //Monitor.TryEnter(syncRoot, 500, ref lockTaken);
                //if (lockTaken)
                //{
                //    try
                //    {
                //        //do something
                //    }
                //    finally
                //    {
                //        Monitor.Exit(syncRoot);
                //    }
                //}
                //else//未获得锁
                //{
                //    //do something else
                //}
            }
        }
        public class Job
        {
            SharedState sharedState;
            public Job(SharedState sharedState)
            {
                this.sharedState = sharedState;
            }
            public void DoTheJob()
            {
                for (int i = 0; i < 5000; i++)
                {
                    sharedState.IncrementState();
                }
            }
        }
    }
    

      

  • 相关阅读:
    XML WebService完全实例详细解析
    List (Java 2 Platform SE 5.0)
    frameset
    关于在outlook2007里面编辑签名的问题
    关于javax.servlet.Http.*;不能被引用的问题
    select标签HTML,刚做地。
    UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
    玩转UICollectionViewLayout
    常用公共方法
    cell嵌套UIWebView遇到的几个问题
  • 原文地址:https://www.cnblogs.com/aitong/p/10796293.html
Copyright © 2020-2023  润新知