C# 等值锁定
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# 等值锁定的更多相关文章
- 记录一下MySql update会锁定哪些范围的数据
目录 1.背景 2.前置知识 2.1 数据库的隔离级别 2.2 数据库版本 2.3 数据库的存储引擎 2.4 锁是加在记录上还是索引上 2.5 update...where加锁的基本单位是 2.6 行 ...
- ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端
在使用SSH终端(如Xshell)登陆时,若不慎点击 Ctrl + S 按键,会导致终端很像被锁定,输入和输出都无响应. 这是由于操作系统的终端收到指令 Ctrl + S 后,会暂停终端输入输出的刷 ...
- NPOI导出数据,设置格式,锁定单元格
代码包括: 1:导出多个sheet 2:设置单元格格式 3:合并单元格 4:下拉框选项 5:输入数字限制 6:锁定单元格 static void Main(string[] ar ...
- 文件共享锁定数溢出-IWorkspaceEdit.StopEditing
在批量保存Feature至本地mdb的时候,当Feature的数量超过一定的值(该值不确定是不是Access文件的MaxLocksPerFile值,因为当MaxLocksPerFile为9500时,F ...
- Android中锁定文件的方法
androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...
- UWP Composition API - 锁定列的FlexGrid
需求是第一列锁定,那么怎么让锁定列不跟着滚动条向做移动呢? 其实很简单,让锁定列跟scrollviewer的滚动做反方向移动. 先看一下这个控件的模板,嗯,其实很简单,就是ListView的模板,不同 ...
- Vmware无法获取快照信息 锁定文件失败
今天早上起来发现虚拟机崩了: 造成原因: 如果使用VMWare虚拟机的时候突然系统崩溃蓝屏,有一定几率会导致无法启动, 会提示:锁定文件失败,打不开磁盘或快照所依赖的磁盘: 这是因为虚拟机在运行的时候 ...
- Python3.5 Day1作业:实现用户密码登录,输错三次锁定。
作业需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3. ...
- Oracle账户解锁/锁定
1. 首先用系统账号登录: sqlplus /nolog conn /as sysdba 2. 输入命令对账户解锁/锁定: ALTER USER scott ACCOUNT UNLOCK ALTER ...
随机推荐
- JDBC处理Transaction
package com.ayang.jdbc; import java.sql.*; /** * transaction的构成,随便写一句insenrt,一执行executeUpdate(),它自动提 ...
- Jetty 的工作原理
创建一个ServletContextServer类,用来初始化web应用程序的Context,并且指定Servlet和Servlet匹配的url.这里指定了两个Servlet,分别是HelloServ ...
- ibatis插入正确但查询不出数据的问题
现在,使用打印的sql在oracle数据库客户端能查询出结果,但执行ibatis查询语句不行,ibatis插入可以. 解决问题的历程: 1. 去掉sql中的where语句,仍然查找不到,确定不是sql ...
- 了解SSL必须要懂得密码技术
要理解SSL就必须理解密码系统.消息摘要函数(单向或散列函数)和数字签名,这些技术是许多文献所讨论的主题(比如[AC96),提供了保密性.完整性和认证的基础. 密码系统 假设Alice想给她的银行发一 ...
- Rest客户端
public class RestClient { public string EndPoint { get; set; } //请求的url地址 public HttpVerb Method { g ...
- Javad的Validator框架概述
Java EE 6 提出了 Bean Validation 规范,使用注解的方式对 Java Bean 进行约束验证,不局限于某一层次或者某一编程模型,灵活易用.下边将向您系统的介绍该规范的各种特性. ...
- [转]关于NTLM认证的.NET,php,python登录
本文转自:http://www.cnblogs.com/myx/archive/2013/03/25/php-ntlm-python-net.html 早期SMB协议在网络上传输明文口令.后来出现 L ...
- 批量删除SVN文件
开发过程中,有时需要将SVN目录中的SVN相关的信息去掉,有两种简单方法可以做到: 一,用SVN的export功能 二,将下面的这段文字写在.reg结尾的文本文件中,然后执行.这样你在每个文件夹右击的 ...
- 二:Bootstrap-css组件
Glyphicons 图标: span.glyphicon glyphicon-align-center 下拉菜单: div.dropdown/div.btn-group button[data-to ...
- 五、standalone运行模式
在上文中我们知道spark的集群主要有三种运行模式standalone.yarn.mesos,其中常被使用的是standalone和yarn,本文了解一下什么是standalone运行模式,它的运行流 ...