zoukankan      html  css  js  c++  java
  • C#,多线程死锁很容易哦

    原文写于:2008-02-04

        这几天在看C#多线程的东东,确保多个线程不死锁是比较难的,但要死锁很容易。试着写了段死锁的代码,见下文。
        环境:.NET 2.0
        基本思路:学OS时的经典问题,两个线程抢占两个资源,线程1抢到了资源A,还需要资源B;线程2抢到了资源B,还需要资源A;结果就死锁了。 
     1  using System;
     2  using System.Collections.Generic;
     3  using System.Text;
     4  using System.Threading;
     5     
     6  namespace MultiThreadTest
     7  {
     8        class Program
     9     {
    10            static void Main(string[] args)
    11        {
    12      Deadlock
    20            }

    21     
    23        }

    24    
    25        class Deadlock
    26       {
    27            object locker1 = new object();
    28            object locker2 = new object();
    29            string s1="StartFromLocker1", s2="StartFromLocker2";
    30            string l1 = "locker1", l2 = "locker2";
    31     
    32            public void StartFromLocker1()
    33           {
    34                lock(locker1)
    35               {
    36                    Console.WriteLine("{0} got {1}", s1, l1);
    37                    Thread.Sleep(500);
    38                    Console.WriteLine("{0} waiting for {1}", s1, l2);
    39                    lock(locker2)
    40                    {
    41                        Console.WriteLine("{0} got {1}", s1, l2);
    42                        Thread.Sleep(500);
    43                    }

    44                }

    45                Console.WriteLine("leaving {0}", s1); 
    46            }

    47     
    48            public void StartFromLocker2()
    49           {
    50                lock (locker2)
    51               {
    52                    Console.WriteLine("{0} got {1}", s2, l2);
    53                   Thread.Sleep(500);
    54                    Console.WriteLine("{0} waiting for {1}", s2, l1);
    55                    lock (locker1)
    56                   {
    57                        Console.WriteLine("{0} got {1}", s2, l1);
    58                        Thread.Sleep(500);
    59                    }

    60                }

    61                Console.WriteLine("leaving {0}", s2); 
    62            }

    63        }
    ;
    64   }
         运行结果:
    StartFromLocker1 got locker1
    StartFromLocker2 got locker2
    StartFromLocker1 waiting for locker2
    StartFromLocker2 waiting for locker1
     
  • 相关阅读:
    xml
    反射
    类加载器
    TCP通信
    UDP通信
    网络通信
    【SpringBoot】Freemarkerの主キー
    【SpringBoot】Warの作成
    【Excel】ファイルの拡張子
    【SAP】TCODE表
  • 原文地址:https://www.cnblogs.com/ols/p/1179867.html
Copyright © 2011-2022 走看看