• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • .NET多線程小記(6):線程同步

    發表于:2012-08-14來源:博客園作者:Jack_wangds點擊數: 標簽:.NET多線程
    同步塊的機制: 在.NET被加載時初始化同步塊數組 每一個被分配在堆上的對象都會包含兩個額外的字段,其中一個存儲類型指針,而另外一個就是同步塊索引,初始時被賦值為-1.

      同步塊的機制:

      在.NET被加載時初始化同步塊數組

      每一個被分配在堆上的對象都會包含兩個額外的字段,其中一個存儲類型指針,而另外一個就是同步塊索引,初始時被賦值為-1.

      當一個線程試圖使用該對象進入同步時,會檢查該對象的同步索引。如果索引為負數,則會在同步塊數組中尋找或者新建一個同步塊,并且把同步塊的索引值寫入該對象的同步索引中。如果該對象的同步索引不為負值,則找到該對象的同步塊并且檢查是否有其他線程在使用該同步塊,如果有則進入等待狀態,如果沒有則聲明使用該同步塊。

      當一個對象退出同步時,該對象的同步索引被賦值為-1,并且對應的同步塊數組內的同步塊被視為不再使用。

    image

      ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
     
    namespace MultiThreadTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("測試靜態方法同步?");
                for (int i = 0; i < 5; i++)
                {
                    Thread t = new Thread(Lock.Add1);
                    t.Start();               
                }
                Thread.Sleep(10 * 1000);
                Console.WriteLine("測試成成員方法同步");
                Lock l = new Lock();
                for (int i = 0; i < 5; i++)
                {
                    Thread t = new Thread(l.Add2);
                    t.Start();
                }
                Console.Read();
            }        
        }
     
        public class Lock
        {
            // 用來同步靜態方法
            private static object o1 = new object();
            private static int i1 = 0;
     
            // 用來同步成員方法
            private object o2 = new object();
            private int i2 = 0;
     
     
            public static void Add1(object state)
            {
                lock (o1)
                {
                    Console.WriteLine("before add:i1 = {0}", i1);
                    Thread.Sleep(1000);
                    i1++;
                    Console.WriteLine("after add :i1 = {0}", i1);
                }            
            }
     
            public  void Add2(object state)
            {
                lock (o2)
                {
                    Console.WriteLine("before add:i1 = {0}", i2);
                    Thread.Sleep(1000);
                    i2++;
                    Console.WriteLine("after add :i1 = {0}", i2);
                }
            }    
        }
    }

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>