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(1, 1));
            }
            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 = 0; i < 10; i++)
            {
                new Thread(() =>
                {
                    string ss = new string(‘1‘, 3);

                    int threadHashCode = System.Threading.Thread.CurrentThread.GetHashCode();
                    Console.WriteLine(threadHashCode + "尝试进来");
                    stringLock.Enter(ss);
                    //do something
                    Console.WriteLine(threadHashCode +  "进来");
                    Thread.Sleep(1000);
                    Console.WriteLine(threadHashCode + "出来");
                    stringLock.Exit(ss);

                }).Start();
            }

            Console.WriteLine("是否释放资源?(y/n)");
            string isFree = Console.ReadLine();
            if (isFree == "y")
            {
                stringLock.Free();
            }
            Console.Read();
        }
}
时间: 2024-12-25 10:58:05

C# 等值锁定的相关文章

用Python 编写的清除U8系统单据锁定的脚本

经常被财务打电话过来要求解除锁定,头疼,要远程到服务器上,打开迟钝的sql 2005管理器复制两条解除锁定的任务,事情一忙就会忘记,免不了被第二次催,在网上下载的清除锁定的工具好像只能用在"畅捷通T6,T3"上,U8不能用.就想着做个小脚本或者程序,想起来之前有个codematic可以把sql语句自动生成为C#代码.可打开软件后,发现对C#如何新建工程和编译,一点都不懂. 想起来网上说的"一个功能,用C来写,可能要100行,用JAVA要20行,而用 Python只需要5行&q

引用账户当前已锁定,且可能无法登录”--问题的解决方法(转载)

indows 7下面,登录到另外一个AD域里面更改网络密码时遇到了错误,"引用账户当前已锁定,且可能无法登录",如下图,经反复摸索,最后找到解决方法. 点击"开始"->"运行",输入gpedit.msc并回车打开"组策略",依次展开:计算机配置-windows设置-安全设置-帐户策略-帐户锁定策略中找"帐户锁定阀值",双击,数值设置选0,确定.

SQL Server中如何定位Row Lock锁定哪一行数据

在SQL Server中有时候会使用提示(Hint)强制SQL使用行锁(Row Lock),前两天有个同事咨询了一个问题,如何定位Row Lock具体锁定了哪一行.其实这个问题只适合研究一下,实际意义并不大,因为找到.定位被锁定的行的代价开销较大,而意义却不怎么大,而且使用场景也很少.那么下面我们来探讨.研究一下这个问题吧: 在会话窗口(会话ID=65)下执行下面SQL语句,模拟SQL Server使用行锁锁定某一行记录: USE AdventureWorks2012; GO   SELECT 

最近开始努力学python 写了一个python小代码:判断一个登陆程序,如果账号密码输错3次,锁定账号无法再登陆

1 count = 0 2 username = 'zhangsan' 3 userpassword = '111111' 4 5 f = open('lock.txt','r+') 6 file_list = f.readlines() 7 f.close() 8 #打开文件夹 读取数据 9 10 name = input("请输入用户名:") 11 12 if name in file_list: 13 print("您的账号被锁定!") 14 #判断文件夹中的

centos7 搭建vsftpd服务并锁定用户的家目录

1.安装vsftpd服务 yum install vsftpd -y 2.创建用户 useradd vsftp -s /sbin/nologin ####添加用户,并且这个用户没有登陆系统的权限passwd vsftp 3.修改vsftp配置文件 [[email protected] home]# vim /etc/vsftpd/vsftpd.conf 把其中的某些注释取消 chroot_local_user=YES ####锁定本地用户的家目录,但是目录本身的w权限要取消.这是安全考虑,若不取

作业一:登录界面(优化,能读取锁定文件中的任意用户名,一旦发现所输入的用户名是锁定文件中的,立即告知并跳出循环)

1 #Author:AXIN 2 #功能:登录窗口 3 # 1.输入用户名,密码 4 # 2.认证成功后输出提示信息,表示欢迎 5 # 3.输错3次后锁定用户名(写入文件) 6 _name = 'AXIN' 7 _password = '123qwe' 8 temp = 0 9 count_2 = 0 10 lock_flag = 0 11 12 name = input("Name:") 13 password = input("Password:") 14 15

实现用户登录并且输入错误三次后锁定该用户

我的测试环境,win7,python3.6,Pycharm社区版 提示输入用户名,和密码 判断是否被锁定 判断用户名和密码是否匹配 输入错误三次,账号被锁定 real_user = 'channel' #正确的用户名 real_passwd = 'asdf' #正确的密码 lock_user = ['tiaozhan'] #锁定账号列表 while True: user_input = input("输入用户名") passwd_input = input('your passwd:'

yum锁定强行解锁

Another app is currently holding the yum lock; waiting for it to exit...  The other application is: PackageKit    Memory : 153 M RSS (266 MB VSZ)    Started: Thu Jul 12 00:03:05 2012 - 06:19 ago State  : Sleeping, pid: 4018 解决方法: rm -rf /var/run/yum.

python装饰器:实现登录账户三次失败,账户自动锁定

1.定义无参装饰器为被装饰器添加统计运行时间的功能2.定义有参装饰器为被装饰器添加认证功能:用户的信息可以来源于file也可以是ldap,三次验证失败锁定用户 同http://www.cnblogs.com/xuyaping/p/6679305.html,只不过加了装饰器统计时间和认证功能.