开启多个线程,每个线程中多次操作公共变量

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace TestLock
{
class Program
{
static void Main(string[] args)
{ Test1(); } public static void Test1()
{
Thread[] threads = new Thread[]; //开启10个线程 Animal a = new Animal();
for (int i = ; i < ; i++)
{
Thread t = new Thread(a.Add1); //10 个线程同时执行方法 Add1 threads[i] = t;
}
for (int i = ; i < ; i++)
{
threads[i].Start(); //启动线程
} Console.ReadLine();
} } public class Animal
{
int balance = ;
private object obj = new object();
public void Add1()
{
for (int i = ; i < ; i++) //每个线程执行1000次Withdraw1方法
{
Withdraw1(new Random().Next(, ));
}
}
public void Withdraw1(int a)
{
if (balance < )
{ throw new Exception("为负了"); } //不加锁,就会抛出该异常,加锁后不会抛出
//lock (obj)
//{
if (balance >= a)
{
Console.WriteLine("before"+balance);
Console.WriteLine("减去"+a);
balance = balance - a; //多线程情况下,此处balance 会被其他线程修改,造成负值
Console.WriteLine("剩余" + balance);
}
//} } } }

多线程的并发问题,lock用法的更多相关文章

  1. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  2. 多线程中lock用法的经典实例

    多线程中lock用法的经典实例 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...

  3. 多线程高并发编程(3) -- ReentrantLock源码分析AQS

    背景: AbstractQueuedSynchronizer(AQS) public abstract class AbstractQueuedSynchronizer extends Abstrac ...

  4. Java 多线程与并发【原理第一部分笔记】

    Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...

  5. JAVA 多线程和并发学习笔记(三)

    Java并发编程中使用Executors类创建和管理线程的用法 1.类 Executors Executors类可以看做一个“工具类”.援引JDK1.6 API中的介绍: 此包中所定义的 Execut ...

  6. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  7. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  8. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  9. java5 Lock用法

    锁是控制多个线程对共享资源进行访问的工具.通常,锁提供了对共享资源的独占访问.一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁.不过,某些锁可能允许对共享资源并发访问,如 ReadWri ...

随机推荐

  1. NGUI 添加回调函数

    //缓动完成 TweenPosition tweenPos=GetComponent<TweenPosition>(); tweenPos.AddOnFinished(complete); ...

  2. HDU 2444 The Accomodation of Students

    首先是要构造二分图,然后二分图的最大匹配. 还有没完全证明过我的方法的正确性,但是AC了..... #include<cstdio> #include<cstring> #in ...

  3. P2P应用中的NAT穿透问题

    多年前曾经写过一个关于NAT钻洞的实验.现在发现那个做法在我现在的路由器上已经不管用了.经过一番搜索发现时过境迁,世界变化很快,新路由器已经是UPnP了.在这里重新理一下几种方法. 第一种,也是不太靠 ...

  4. jq中的css-Dom

    1,height() ,width() 此方法用来获取匹配元素的高和宽的值,如果括号内有值,则是修改匹配元素的值, 2.offset() 此方法的作用是获取元素在当前视窗的相对偏移,其中返回的对象包含 ...

  5. Ubuntu防火墙ufw安装配置

    ubuntu 系统默认已安装ufw. 1.安装sudo apt-get install ufw2.启用sudo ufw enablesudo ufw default deny运行以上两条命令后,开启了 ...

  6. BAT54C 二极管是如何工作的?

    这是一个多电源供电的电路:Vcc是正常供电电源(如5V,由市电变换得到),电压大于(Vcc1-Vf),正常供电时二极管不导通:Vcc1是电池供电电源,当Vcc撤掉时,DD1(上边的二极管)导通,由Vc ...

  7. string转化为int方法

    int intA = 0; 1.intA =int.Parse(str); 2.int.TryParse(str, out intA); 3.intA = Convert.ToInt32(str);以 ...

  8. angular指令系列---多行文本框自动高度

    angular.module('MyApp') .directive('autoTextare', ['$timeout', function ($timeout) { return { restri ...

  9. j2ee常用包的作用

    1.antlr-2.7.7.jar 呵呵 一句话,没有此包,hibernate不会执行hql语句   2.aopalliance-1.0.jar 这个包是AOP联盟的API包,里面包含了针对面向切面的 ...

  10. android复习-AnsyTask

    AnsyTask是一种类似Thread+Hander机制的处理耗时操作的类, 通过在UI线程中excute()启动操作, 在AnsyTask中 doInBackground()中处理耗时操作(运行在自 ...