热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#Monitor与线程同步

Monitor对象(C#知识点总结系列:4、C#中Monitor和Lock以及区别)1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释

  Monitor对象(C#知识点总结系列:4、C#中Monitor和Lock以及区别)

  1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit())。

  2.Monitor的常用属性和方法:

    Enter(Object) 在指定对象上获取排他锁。

    Exit(Object) 释放指定对象上的排他锁。

    IsEntered 确定当前线程是否保留指定对象锁。

    Pulse 通知等待队列中的线程锁定对象状态的更改。

    PulseAll 通知所有的等待线程对象状态的更改。

    TryEnter(Object) 试图获取指定对象的排他锁。

    TryEnter(Object, Boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。

    Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。

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

//线程同步与多线程程序中的隐患
namespace Multithreading_hazard
{
class Program
{
private static int stickets = 100;
static object gloalObj=new object();//辅助对象
static void Main(string[] args)
{
Thread thread1
= new Thread(SaleTicketThread1);
Thread thread2
= new Thread(SaleTicketThread2);
thread1.Start();
thread2.Start();
Thread.Sleep(
4000);
}

private static void SaleTicketThread1()
{
while (true)
{
try
{
Monitor.Enter(gloalObj);
//在gloalObj对象上获得排他锁
Thread.Sleep(1);
if (stickets > 0)
{
Console.WriteLine(
"线程一出票{0}:", stickets--);
}
else
{
break;
}
}
finally
{

Monitor.Exit(gloalObj);
//释放指定对象上的排他锁
}

}
}
private static void SaleTicketThread2()
{
while (true)
{

try
{
Monitor.Enter(gloalObj);
//在gloalObj对象上获得排他锁
Thread.Sleep(1);
if (stickets > 0)
{
Console.WriteLine(
"线程二出票{0}:", stickets--);
}
else
{
break;
}
}
finally
{

Monitor.Exit(gloalObj);
//释放指定对象上的排他锁
}
}
}
}

}

 

利用Monitor的Enter(Object) 、Exit(Object)实现了线程同步,一个线程将等待前一个线程执行完成后,才继续执行


推荐阅读
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • Java 中的等时日期(int,int)方法,示例 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
author-avatar
kaxiaoliog_334
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有