首页 > 使用lock同步线程,建立了10个线程实例

使用lock同步线程,建立了10个线程实例

在C#中处理同步

过对指定对象的加锁和解锁可以实现同步代码段的访问。

在.NET的System.Threading命名空间中提供了Monitor类来实现加锁与解锁。该类中的方法都是静态的。

如下表:





C#中 lock关键字提供了与Monitoy.Enter和Monitoy.Exit同样的功能,这种方法用在你的代码段不能被其他独立的线程中断的情况。通过对Monitor类的简易封装,lock为同步访问变量提供了一个非常简单的方式,其用法如下:

lock(x)

{

 // 使用x的语句

}

lock语句把变量放在圆括号中,以包装对象,称为独占锁或排它锁。当执行带有lock关键字的复合语句时,独占锁会保留下来。当变量被包装在独占锁中时,其他线程就不能访问该变量。如果在上面的代码中使用独占锁,在执行复合语句时,这个线程就会失去其时间片。如果下一个获得时间片的线程试图访问变量,就会被拒绝。Windows会让其他线程处于睡眠状态,直到解除了独占锁为止。

 

ContractedBlock.gifExpandedBlockStart.gifCode

using System;

using System.Threading;





namespace ConsoleApplication2

{

    
class Account

    {

        
int balance;    // 余额

        Random r = new Random();

        
public Account(int initial)

        {

            balance 
= initial;

        }

        
// 取钱

        int Withdraw(int amount)

        {

            
if (balance < 0)

                
throw new Exception("余额为负!"); 

            
lock (this)

            {

                
if (balance >= amount)

                {

                    Console.WriteLine(
"原有余额:  " + balance);

                    Console.WriteLine(
"支取金额: -" + amount);

                    balance 
= balance - amount;

                    Console.WriteLine(
"现有余额:  " + balance);

                    
return amount;

                }

                
else

                {

                    
return 0;   // 拒绝交易

                }

            }

        }

        

        
// 测试交易

        public void DoTransactions()

        {

            
// 支取随机的金额100次

            for (int i = 0; i < 100; i++)

            {

                Withdraw(r.Next(
1100));

            }

        }

    }

    

    
class TestApp

    {

        
public static void Main()

        {

            
// 建立10个线程同时进行交易

            Thread[] threads = new Thread[10];

            Account acc 
= new Account(100000000);

            
for (int i = 0; i < 10; i++)

            {

                Thread t 
= new Thread(new ThreadStart(acc.DoTransactions));

                threads[i] 
= t;

            }

            
for (int i = 0; i < 10; i++)

            {

                threads[i].Start();

            }

        }

    }

}

转载于:https://www.cnblogs.com/0754ydj/archive/2008/12/18/1357677.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 描述 头文件:声明方式: template< class Mutex > class lock_guard;简介 lock_guard是一种互斥包装器,它提供了非常便捷的raii资源管控技术用来在对象生存周期内提供互斥锁。 lock_gurad很好得解决了互斥变量mutex的锁成员在函数异常期间无法正常回收资源的问题。...

  • apt Could not get lock /var/lib/dpkg/lock 解决方案 删除锁定文件 sudo rm /var/lib/dpkg/lock...