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

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. android 市场发布应用小结

    1:360平台发布应用 网址:http://dev.app.360.cn/ 2:腾讯应用宝 平台发布应用: 地址:http://op.open.qq.com/  (未审核通过的不能更新版本) 3:发布 ...

  2. ButterKnife-5.1.2.jar(较低版本的ButterKnife)使用方法

    ButterKnife注解是编译时注解,Xutils是运行时注解.很明显编译时注解性能更高 一.先配置好环境 1.在工程上右键,选Properties,然后选Java Compiler,选Annota ...

  3. Cannot call sendRedirect() after the response has been committed

    AJAX+JSP时,out.write('content')之后,如果后面还有代码,无法被执行到,会报 错,java.lang.IllegalStateException: Cannot call s ...

  4. 链表基础 HDU1267

    基础的链表,模拟一下就好了...就签个到

  5. vsftp访问异常

    在LINUX下vsftp建立一个FTP服务器,但通过ftp的命令控制台使用FTP时,ls无法查看目录, 当然更无法上传下载文件了! 出错如下 : ftp> ls 227 Entering Pas ...

  6. 别在int与float上栽跟头(转)

    源:http://www.cnblogs.com/luguo3000/p/3719651.html int与float是我们每天编程都用的两种类型,但是我们真的足够了解它们吗.昨天在博客园看到一个比较 ...

  7. DIV撑开

    引用自:http://radzhang.iteye.com/blog/1678734 在CSS排版中,如果一个层中的层使用了float浮动的话,那么就有可能会出现外层没有被内层撑开的情况,如以下代码所 ...

  8. cell选中与取消选中调用的方法

    //选中与取消选中都会调用哦,注意!!- (void)setSelected:(BOOL)selected animated:(BOOL)animated{ [super setSelected:se ...

  9. SqlServer批量导入

    SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...

  10. 【HighCharts系列教程】三、图表属性——chart

    一.chart属性说明 Chart是HighCharts图表中主要属性,包括了图表区域的颜色.线条.高度.宽度.对齐.图表类型等诸多属性,也是HighCharts图表中必须配置的属性之一. 配置cha ...