zoukankan      html  css  js  c++  java
  • Part 95 to 96 Deadlock in a multithreaded program

    Part 95   Deadlock in a multithreaded program

    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("main start");
                Account a1 = new Account(001,10000);
                Account a2 = new Account(002,20000);
                AccountManager m1 = new AccountManager(a1,a2,5000);
                Thread t1 = new Thread(m1.Transfer);
                t1.Name = "t1";
                AccountManager m2 = new AccountManager(a2, a1, 3000);
                Thread t2 = new Thread(m2.Transfer);
                t2.Name = "t2";
                t1.Start();
                t2.Start();
                t1.Join();
                t2.Join();
                Console.WriteLine("main end");
            }
        }
    
        class Account
        {
            public int ID { get; set; }
            public double Balance { get; set; }
            public Account(int id, double balance)
            {
                this.ID = id;
                this.Balance = balance;
            }
            public void WithDraw(double amount)
            {
                Balance -= amount;
            }
            public void Deposit(double amount)
            {
                Balance += amount;
            }
        }
    
        class AccountManager
        {
            public Account FromAccount { get; set; }
            public Account ToAccount { get; set; }
            public double AmountToTransfer { get; set; }
            public AccountManager(Account from,Account to,double amountToTransfer)
            {
                this.FromAccount = from;
                this.ToAccount = to;
                this.AmountToTransfer = amountToTransfer;
            }
            public void Transfer()
            {
                Console.WriteLine(Thread.CurrentThread.Name+"try to acquire lock on"+FromAccount.ID.ToString());
                lock (FromAccount)
                {
                    Console.WriteLine(Thread.CurrentThread.Name+" acquired lock on "+FromAccount.ID.ToString());
                    Console.WriteLine(Thread.CurrentThread.Name+" suspended for 1 second");
                    Thread.Sleep(1000);
                    Console.WriteLine(Thread.CurrentThread.Name+"back in action and try to acquire lock on" +ToAccount.ID.ToString());
                    lock (ToAccount)
                    {
                        Console.WriteLine("this code will not execute");
                        FromAccount.WithDraw(AmountToTransfer);
                        ToAccount.Deposit(AmountToTransfer);
                    }
                }
            }
    
        }
    View Code

    Part 96   How to resolve a deadlock in a multithreaded program

    static void Main(string[] args)
            {
                Console.WriteLine("main start");
                Account a1 = new Account(101,10000);
                Account a2 = new Account(102,20000);
                AccountManager m1 = new AccountManager(a1,a2,5000);
                Thread t1 = new Thread(m1.Transfer);
                t1.Name = "t1";
                AccountManager m2 = new AccountManager(a2, a1, 3000);
                Thread t2 = new Thread(m2.Transfer);
                t2.Name = "t2";
                t1.Start();
                t2.Start();
                t1.Join();
                t2.Join();
                Console.WriteLine("main end");
            }
        }
    
        class Account
        {
            public int ID { get; set; }
            public double Balance { get; set; }
            public Account(int id, double balance)
            {
                this.ID = id;
                this.Balance = balance;
            }
            public void WithDraw(double amount)
            {
                Balance -= amount;
            }
            public void Deposit(double amount)
            {
                Balance += amount;
            }
        }
    
        class AccountManager
        {
            public Account FromAccount { get; set; }
            public Account ToAccount { get; set; }
            public double AmountToTransfer { get; set; }
            public AccountManager(Account from,Account to,double amountToTransfer)
            {
                this.FromAccount = from;
                this.ToAccount = to;
                this.AmountToTransfer = amountToTransfer;
            }
            public void Transfer()
            {
                object _lock1, _lock2;
                if(FromAccount.ID<ToAccount.ID)
                {
                    _lock1 = FromAccount;
                    _lock2 = ToAccount;
                }
                else
                {
                    _lock1 = ToAccount;
                    _lock2 = FromAccount;
                }
                Console.WriteLine(Thread.CurrentThread.Name+"try to acquire lock on "+((Account)_lock1).ID.ToString());
                lock (_lock1)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + " acquired lock on " + ((Account)_lock1).ID.ToString());
                    Console.WriteLine(Thread.CurrentThread.Name+" suspended for 1 second");
                    Thread.Sleep(1000);
                    Console.WriteLine(Thread.CurrentThread.Name + "back in action and try to acquire lock on " + ((Account)_lock2).ID.ToString());
                    lock (_lock2)
                    {
                        Console.WriteLine(Thread.CurrentThread.Name + " acquired lock on " + ((Account)_lock2).ID.ToString());
                        FromAccount.WithDraw(AmountToTransfer);
                        ToAccount.Deposit(AmountToTransfer);
                        Console.WriteLine(Thread.CurrentThread.Name+" Transferd "+AmountToTransfer.ToString()+" from "+FromAccount.ID.ToString()+" to "+ToAccount.ID.ToString());
                    }
                }
            }
    View Code

  • 相关阅读:
    可以兼容ie6的纯CSS三级鼠标悬停显示/隐藏菜单实现
    关于网页中行内元素的基线(baseline)、行高(line-height)、垂直对齐(vertical-align)等
    [z]CSS在Internet Explorer 6, 7 和8中的差别
    POJ 2318--TOYS(二分找点,叉积判断方向)
    博弈论笔记--05--纳什均衡之坏风气与银行挤兑
    博弈论笔记--04--足球比赛与商业合作之最佳对策
    博弈论笔记--03--迭代剔除和中位选民定理
    博弈论笔记--02--学会换位思考
    博弈论笔记--01--五个入门结论
    C++新闻检索类
  • 原文地址:https://www.cnblogs.com/gester/p/4870467.html
Copyright © 2011-2022 走看看