2012-02-08 4 views
3

ロックをParentクラスに移動する単純な解決策は、異なる動作です。new Child1().Method1()new Child2().Method1()を同時に呼び出すことはできません。これらのロックをどのようにリファクタリングするのですか?

以下のコードをリファクタリングする方法はありますか?

abstract class Parent 
{ 
    protected abstract Method1(); 
} 

class Child1 : Parent 
{ 
    static object staticLock = new object(); 

    public void Method1() 
    { 
     lock(staticLock) 
     { 
      // Do something ... 
     } 
    } 
} 

class Child2 : Parent 
{ 
    static object staticLock = new object(); 

    public void Method1() 
    { 
     lock(staticLock) 
     { 
      // Do something else ... 
     } 
    } 
} 

私はこれが2つの子クラスだけではないので、これを求めています。実際の問題はより大きくなります。

+0

作品? – Joe

+3

ロックオブジェクトは静的なのはなぜですか? – Domenic

+0

@Domenicこれらのクラスは物理マシンを表し、インスタンスはクライアントであり、いつでも1つのクライアントしかマシンを制御できません –

答えて

2

ロックポリシーを提供する各子クラスによって実装され、other質問のようにMethod1を基本クラスに移動するメソッドがあります。ロックの範囲が正しい場合

class Parent 
{ 
    public void Method1() 
    { 
    using(acquireLock()) 
    { 
     Method1Impl(); 
    } 
    } 
    protected abstract IDisposable acquireLock(); 
    protected abstract void Method1Impl(); 
} 
class Child : Parent 
{ 
    protected override IDisposable acquireLock() 
    { 
     // return some class that does appropriate locking 
     // and in Dispose releases the lock. 
     // may even be no-op locking. 
    } 
} 
0

たぶんこれは、なぜまったくリファクタリング(例えば、特定の派生クラス内)

abstract class Parent 
{ 
    protected abstract object StaticLock { get; } 

    public void Method() 
    { 
     lock(staticLock) 
     { 
      MethodImpl(); 
     } 
    } 

    protected abstract MethodImpl(); 
} 

class Child1 : Parent 
{ 
    private static object staticLock = new object(); 

    protected override object StaticLock { get { return staticLock; } } 

    protected override MethodImpl() 
    { 
      // Do something ... 
    } 
} 

class Child2 : Parent 
{ 
    private static object staticLock = new object(); 

    protected override object StaticLock { get { return staticLock; } } 

    protected override MethodImpl() 
    { 
      // Do something else ... 
    } 
} 
+0

一目見て私にはうまくて、私よりも簡単です。 –

+0

@AlexeiLevenkovしかし私は暗黙のコピーに心配しています。 'staticLock'オブジェクトがコピーされると、ロックオブジェクトが失われるので有効です。 –

+0

"staticLock"オブジェクト( 'staticObject = new Object()')を置き換えない限り、オブジェクトは常に参照渡しされます。 –

関連する問題