Sunday, 29 December 2019

C# - Thread Lock


Simple Example 1


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

namespace ThreadLock
{
    class Program
    {
        static readonly object lockobject = new object();

        static void PrintInfo()
        {
            lock (lockobject)
            {
                for (int i = 1; i <= 4; i++)
                {
                    Console.WriteLine("i value: {0}", i);
                    Thread.Sleep(1000);
                }
            }
        }

        static void Main(string[] args)
        {
            Thread t1 = new Thread(new ThreadStart(PrintInfo));
            Thread t2 = new Thread(new ThreadStart(PrintInfo));
            t1.Start();
            t2.Start();
            Console.ReadLine();
        }
    }
}



MSDN

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

namespace Bank
{   
    public class Account
    {
        private readonly object balanceLock = new object();
        private decimal balance;

        public Account(decimal initialBalance)
        {
            balance = initialBalance;
        }

        public decimal Debit(decimal amount)
        {
            lock (balanceLock)
            {
                if (balance >= amount)
                {
                    Console.WriteLine($"Balance before debit :{balance,5}");
                    Console.WriteLine($"Amount to remove     :{amount,5}");
                    balance = balance - amount;
                    Console.WriteLine($"Balance after debit  :{balance,5}");
                    return amount;
                }
                else
                {
                    return 0;
                }
            }
        }

        public void Credit(decimal amount)
        {
            lock (balanceLock)
            {
                Console.WriteLine($"Balance before credit:{balance,5}");
                Console.WriteLine($"Amount to add        :{amount,5}");
                balance = balance + amount;
                Console.WriteLine($"Balance after credit :{balance,5}");
            }
        }
    }

    class AccountTest
    {
        static void Main()
        {
            var account = new Account(1000);
            var tasks = new Task[100];
            for (int i = 0; i < tasks.Length; i++)
            {
                tasks[i] = Task.Run(() => RandomlyUpdate(account));
            }
            Task.WaitAll(tasks);
        }

        static void RandomlyUpdate(Account account)
        {
            var rnd = new Random();
            for (int i = 0; i < 10; i++)
            {
                var amount = rnd.Next(1, 100);
                bool doCredit = rnd.NextDouble() < 0.5;
                if (doCredit)
                {
                    account.Credit(amount);
                }
                else
                {
                    account.Debit(amount);
                }
            }
        }
    }
}
 

No comments:

Post a Comment