.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.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97