2013-05-13 95 views
0
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; 
     } 
    } 
} 

我有一些功能只能运行在单个用户,如果一个用户运行它,其他用户想运行,我只是返回他们“请稍后再试”。所以我想为这些方法实现锁定。 acquireLock返回true它们可以运行,返回false不允许它们运行。 我只想问,我的代码好吗?方法只允许单用户运行

+0

你需要,你怎么称呼他们要小心。考虑返回一个'IDisposable',这样你就可以使用'using'语句。 – SLaks 2013-05-13 19:57:54

回答

1

您的代码容易受到异常(acquireLock和releaseLock之间)的影响。

可能的解决方案:

  • 实现这个类IDisposable
  • 编写1个将委托作为参数的方法。仅在执行锁定时执行委托。

你想要什么是Monitor.TryEnter(...)提供,如果你仍然想将其包装则是这样的:

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; 
    } 

} 
+0

有什么区别?只使用Monitor? – user2339970 2013-05-13 20:16:48

+0

'lock(){}'映射到Monitor.Enter,对于TryEnter你需要一个长表单。 – 2013-05-13 20:26:19

+0

我知道,我的意思是Moniter与lock(){}相同,为什么你的版本更安全? – user2339970 2013-05-13 20:41:54