C#多线程的死锁演示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics ;
using System.Threading ;

namespace 多线程
{
    class 死锁问题
    {
        public static void Main()
        {
            //由于竞态问题,我们使用了锁定,但是,锁定代来的是死锁问题,就是一个线程等待别一个线程解锁
            //而别一个线程也在等待它解锁好接续操作,结果是无限等待下去,傻了B了
            StateObject obj1 = new StateObject() ;
            StateObject obj2 = new StateObject() ;
            new Thread( new StateThreadExec( obj1 , obj2 ).Method1 ).Start() ;
            //先让第一条线程耍会再启动第二条与他抢,最后就死锁了
            //过程是这样的,线程1先锁定s1 再锁定s2 ,如果2条线程同时开,第二条线程可以是在第一条锁定了s1后抢进来的,这时第一
            //条线程还没锁住s2,正好让第二条抢的锁上了,这时第二条线程接着要锁s1,但是他锁不上,被第一条占了。
            //再次切回第一条线程时,他要接着锁s2,他也一样锁不上,被第二条线程锁上了,等的哇
            Thread.Sleep( 1000 ) ;
            new Thread( new StateThreadExec( obj1 , obj2 ).Method2 ).Start() ;
        }
    }

    class StateObject
    {
        private int state = 5;

        public void ChangeState(int loop)
        {
            if (state == 5)
            {
                state++;
                //如果值不是6时,就要执行断言显示
                Trace.Assert(state == 6, "结果不为6,出现在" + loop + "次 线程名字:" + Thread.CurrentThread.Name);
            }

            state = 5;
        }
    }

    class StateThreadExec
    {
        StateObject s1 ;
        StateObject s2 ;

        public StateThreadExec( StateObject s1 , StateObject s2 )
        {
            this.s1 = s1 ;
            this.s2 = s2 ;
        }

        public void Method1()
        {
            for (int i = 0; i < int.MaxValue; i++)
            {
                lock( s1 )
                {
                    lock( s2 )
                    {
                        Console.WriteLine( "方法1在执行第" + i.ToString()  + "次" ) ;
                        s1.ChangeState(0) ;
                        s2.ChangeState(0) ;
                    }
                }
            }
        }

        public void Method2()
        {
            for (int i = 0; i < int.MaxValue; i++)
            {
                lock (s2)
                {
                    lock (s1)
                    {
                        Console.WriteLine("方法2在执行第" + i.ToString() + "次");
                        s1.ChangeState(0);
                        s2.ChangeState(0);
                    }
                }
            }
        }
    }
}
声明: 本文由(孤狼)原创编译,转载请保留链接: C#多线程的死锁演示

 

时间: 2024-11-18 15:15:04

C#多线程的死锁演示的相关文章

java多线程中死锁情况的一个示例

 下面是死锁情况的一个示例代码 [java] view plaincopy package com.qust.demo.money;      class A {          public synchronized void foo(B b) {           System.out.println(Thread.currentThread().getName() + " 进入A的foo");           try {               Thread.slee

多线程中如何避免死锁

死锁是很讨厌的(虽然活锁更讨厌),如何避免死锁呢? 在两个线程间的循环等待是比较容易识别的,但是在死 锁的形成中如果包含多个线程,那么就是难以发现的(现实中不少这种情况). 首先来看看死锁形成的几个必要条 件 1.互斥 2.等待 3.不可抢占 4.循环等待 除了完全避免多线程编程之外,如果要 避免死锁,那么必须要使得上面这4个条件中有任意一个不满足. 1.互斥是大多数锁的一种固有性质,你没办法改 变它. 2.如果程序持有的锁不会多于一个,那么就不会发生死锁问题.但是这通常也是不可能的. 3.不可

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

Linux多线程使用互斥量同步线程_Linux

本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两个信号量才能解决的只有子线程结束了对输入的处理和统计后,主线程才能继续执行的问题. 一.什么是互斥量 互斥量是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次只能有一个线程访问它.为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁. 二.互斥量的函数的使用 它们的定义与使用信号量的函数非常相似,它们的定义如下: #include <pthread.h> int pthre

《Java多线程编程核心技术》——导读

前 言为什么要写这本书早在几年前笔者就曾想过整理一份与Java多线程有关的稿件,因为市面上所有的Java书籍都是以一章或两章的篇幅介绍多线程技术,并没有完整地覆盖该技术的知识点,但可惜,苦于当时的时间及精力有限,一直没有达成所愿.也许是注定的安排,我目前所在的单位是集技术与教育为一体的软件类企业.我在工作中发现很多学员在学习完JavaSE/JavaEE之后想对更深入的技术进行探索,比如在对大数据.分布式.高并发类的专题进行攻克时,立即遇到针对java.lang包中Thread类的学习,但Thre

分布式系统,你真的了解吗?

我们邀请腾讯互娱研发部高级工程师韩伟,分享他所理解的分布式系统.由于内容较多,将分三篇进行讲述,本期第一篇先来看看他眼中的分布式系统究竟是什么吧. 承载量是分布式系统存在的原因 当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序员解决服务器端问题的时候,必须要考虑如何使用多台服务器,为同一种互联网应用提供服务,这就是所谓"分布式系统"的来源

浅析分布式系统

WeTest导读 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂?本文就是想从最基本的地方开始,探寻服务器端系统技术的基础概念.  承载量是分布式系统存在的原因  当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序

一篇文读懂分布式系统本质:高吞吐、高可用、可扩展

承载量是分布式系统存在的原因当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序员解决服务器端问题的时候,必须要考虑如何使用多台服务器,为同一种互联网应用提供服务,这就是所谓"分布式系统"的来源.   然而,大量用户访问同一个互联网业务,所造成的问题并不简单.从表面上看,要能满足很多用户来自互联网的请求,最基本的需求就是所谓性能需求:用户反应

线程启动等待问题

问题描述 今天在博客园的里了解了一下多线程的死锁问题然后我自己修改了一下程序,运行了一下,有个地方不理解,大家帮忙看一下.修改后的java代码如下:publicclassRunnableTestimplementsRunnable{privateintflag=1;privateObjectobj1=newObject(),obj2=newObject();publicvoidrun(){System.out.println("flag="+flag);if(flag==1){sync