using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace FZJ.Lock
{
/// <summary>
/// 等值锁定
/// 锁定给定内容
/// 内容必须实现IComparable接口,若Comparable比较两个对象是同一个值,
/// 则在相等对象上执行的操作是同步的
/// 实际上未对给定对象进行锁定,在外部可以调用lock等
/// </summary>
public class EquivalentLock<T> where T : IComparable<T>
{
Dictionary<T, Semaphore> t2Event = new Dictionary<T, Semaphore>(); System.Threading.SpinLock sl = new SpinLock();
/// <summary>
/// 进入锁定内容
/// </summary>
/// <param name="lockObj">被锁定的内容</param>
public void Enter(T lockObj)
{
bool lockTaken = false;
sl.Enter(ref lockTaken);
if (!t2Event.ContainsKey(lockObj))
{
t2Event.Add(lockObj, new Semaphore(, ));
}
sl.Exit();
t2Event[lockObj].WaitOne();
}
/// <summary>
/// 退出锁定内容
/// </summary>
/// <param name="lockObj">锁定的内容</param>
public void Exit(T lockObj)
{
if (!t2Event.ContainsKey(lockObj))
{
throw new KeyNotFoundException();
}
t2Event[lockObj].Release();
}
/// <summary>
/// 释放存储资源
/// </summary>
public void Free()
{
t2Event.Clear();
}
}
}

方法调用方式。

    class Program
{
static void Main(string[] args)
{ EquivalentLock<string> stringLock = new EquivalentLock<string>(); for (int i = ; i < ; i++)
{
new Thread(() =>
{
string ss = new string('', ); int threadHashCode = System.Threading.Thread.CurrentThread.GetHashCode();
Console.WriteLine(threadHashCode + "尝试进来");
stringLock.Enter(ss);
//do something
Console.WriteLine(threadHashCode + "进来");
Thread.Sleep();
Console.WriteLine(threadHashCode + "出来");
stringLock.Exit(ss); }).Start();
} Console.WriteLine("是否释放资源?(y/n)");
string isFree = Console.ReadLine();
if (isFree == "y")
{
stringLock.Free();
}
Console.Read();
}

C# 等值锁定的更多相关文章

  1. 记录一下MySql update会锁定哪些范围的数据

    目录 1.背景 2.前置知识 2.1 数据库的隔离级别 2.2 数据库版本 2.3 数据库的存储引擎 2.4 锁是加在记录上还是索引上 2.5 update...where加锁的基本单位是 2.6 行 ...

  2. ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端

    在使用SSH终端(如Xshell)登陆时,若不慎点击 Ctrl + S  按键,会导致终端很像被锁定,输入和输出都无响应. 这是由于操作系统的终端收到指令 Ctrl + S 后,会暂停终端输入输出的刷 ...

  3. NPOI导出数据,设置格式,锁定单元格

    代码包括: 1:导出多个sheet    2:设置单元格格式   3:合并单元格   4:下拉框选项   5:输入数字限制   6:锁定单元格 static void Main(string[] ar ...

  4. 文件共享锁定数溢出-IWorkspaceEdit.StopEditing

    在批量保存Feature至本地mdb的时候,当Feature的数量超过一定的值(该值不确定是不是Access文件的MaxLocksPerFile值,因为当MaxLocksPerFile为9500时,F ...

  5. Android中锁定文件的方法

    androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...

  6. UWP Composition API - 锁定列的FlexGrid

    需求是第一列锁定,那么怎么让锁定列不跟着滚动条向做移动呢? 其实很简单,让锁定列跟scrollviewer的滚动做反方向移动. 先看一下这个控件的模板,嗯,其实很简单,就是ListView的模板,不同 ...

  7. Vmware无法获取快照信息 锁定文件失败

    今天早上起来发现虚拟机崩了: 造成原因: 如果使用VMWare虚拟机的时候突然系统崩溃蓝屏,有一定几率会导致无法启动, 会提示:锁定文件失败,打不开磁盘或快照所依赖的磁盘: 这是因为虚拟机在运行的时候 ...

  8. Python3.5 Day1作业:实现用户密码登录,输错三次锁定。

    作业需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3. ...

  9. Oracle账户解锁/锁定

    1. 首先用系统账号登录: sqlplus /nolog conn /as sysdba 2. 输入命令对账户解锁/锁定: ALTER USER scott ACCOUNT UNLOCK ALTER ...

随机推荐

  1. (转)Centos7上部署openstack ocata配置详解

    原文:http://www.cnblogs.com/yaohong/p/7601470.html 随笔-124  文章-2  评论-82  Centos7上部署openstack ocata配置详解 ...

  2. WCF系列教程之WCF客户端调用服务

    1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...

  3. Getway网关管理ZUUL

    1.ZUUL微服务网关 微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服 ...

  4. Linux下mysq基础命令(二)

    1. 创建数据库相关命令: mysql> STATUS(\s) - 列出当前mysql的相关状态信息 mysql> SHOW DATABASES; - 显示数据库列表 mysql> ...

  5. javac的访问者模式2

    (5)Printer /** * A combined type/symbol visitor for generating non-trivial(有意义的) localized string * ...

  6. Spring多线程编程

    在Spring框架下如何保证线程安全,如何很happy顺畅地并发编程. 常见的如下面的这坨代码,在Spring中,默认是单例的,也就是说,在同一时刻只有一个SpringOrdinaryClass的单实 ...

  7. 虚拟机下的zookeeper集群安装

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  8. Python 逐行分割大txt文件

    # -*- coding: <encoding name> -*- import io LIMIT = 150000 file_count = 0 url_list = [] with i ...

  9. 八: 操作提示(wxml 即将废弃)

    首先需要注意的是 wxml的这些属性将要被废弃,不过可以看两眼.不愿意看的可以看下一章节同样是操作回馈只不过是js版的哦.   一.action-sheet 操作菜单 从屏幕底下出来菜单. 这里不用w ...

  10. word转html实现预览(asp.net)

    word转html 需要通过nuget 安装 Microsoft.Office.Interop.Word Microsoft.Office.Interop.Excel 使用 Microsoft.Asp ...