我网站有4-5个操作 只允许 一个用户操作 
如果一个用户正在运行 另一个用户来了企图运行 我就给他返回“等一会再试” (并不是堵塞 直接返回让他过一会再试)
我的代码:
class Lock
{
    private static bool _isLocked = false;
    private static object _objLock = new object();    public bool acquireLock()
    {
        lock (_objLock)
        {
            if (!_isLocked)
            {
                _isLocked = true;
                return true;
            }
            else
            {
                return false;
            }
        }
    }    public void releaseLock()
    {
        lock (_objLock)
        {
            _isLocked = false;
        }
    }
}
某位高手的代码
class MyLock
{
    private static bool _isLocked = false;
    private static object _objLock = new object();    public bool Execute(Action a)
    {
        bool lockTaken = false;
        try
        {     
           Monitor.TryEnter(_objLock , ref lockTaken);
           if (_lockTaken)
           {
               a();
           }
        }
        finally
        { 
           if (lockTaken)
           {
             Monitor.Exit(lockObject);
           }
        }
        return lockTaken; 
    } }   
我就想问问他的办法好在哪?另外有什么更好的办法么

解决方案 »

  1.   

    我网站有4-5个操作 只允许 一个用户操作 还有这种设计??你还如不在数据库里面 加一条 或者搞个全局静态 类 来控制
    静态类里面一个静态 bool 类型 来判断是否有人登陆,当然这个变量是全局的,对于所有用户都是可以访问操作的.
    这样 就不用你说的那种了,你说的那种不行的..
      

  2.   


    那你干嘛lock??
    就是一个静态变量而已.
    登录前 先判断 变量是不是 true
    是true 就等待
    不是 就登陆,然后 赋值true退出登陆 就赋值 false .
      

  3.   

    第一因为他是高手,第二因为他的是黑盒,你的使用时还要在调用的时候try finally{releaseLock();},不用的话很有可能要死锁。他调用只需if( Execute(()=>{...})) else{..没调用到},不过可能他没注意您用的是web吧,否则高手可能写的会更好
      

  4.   

     class MyLock
        {
            private static object _objLock = new object();
            public bool Execute(Action a)
            {
                bool lockTaken = false;
                try
                {
                    Monitor.TryEnter(_objLock, ref lockTaken);
                    if (lockTaken)
                    {
                        a();
                    }
                }
                finally
                {
                    if (lockTaken)
                    {
                        Monitor.Exit(_objLock);
                    }
                }
                return lockTaken;
            }
        }
    高手的方法真不错,可以同步任何一个你想同步的方法,简单清爽
      

  5.   

    要十分珍惜利用全局变量,你的方法中有两个static,那还不如用Interlocked原子操作,效率又高。可好象不在多线程中又不是很多的并发用户应该像一楼说的没有什么必要为赋值加锁吧
      

  6.   

    你这模型 用多线程干什么?
    直接全局或静态变量啊
    有人用 置1 用的人退出后 置0.
    但不现实,因为bS程序,用户是不是再用,你也不知道。只能通过session过期。
    你这个业务模型实在是太诡异了。至于代码,你的代码直接就有问题,acquireLock()返回的结果永远就是!_isLocked。
    你加锁完全是白加了,临界区没控制好,设计多线程、线程同步之前,先搞明白哪些代码是在临界区内,哪些临界区外,还有,既然用了多线程或线程同步,慎用静态变量。仔细看看,我似乎没弄明白你的业务逻辑,
    “我网站有4-5个操作 只允许 一个用户操作 ”
    这句话是微观上,cpu时间片级别的,只允许一个用户操作,比如数据库curd?
    还是宏观上的,a用户操作3-5min,期间其他用户不能操作?必须等a用户完成?
      

  7.   

    还是没理解 我的代码哪里不好(2个static的确不好 也忘了release)
    不过运行方面 功能我的代码没问题吧是宏观的a用户操作3-5min,期间其他用户不能操作?必须等a用户完成?
      

  8.   

    1.公用,
    2.考虑到了异常情况
    3.Monitor相对于lock,不怕死锁想不到其他了