gpt4 book ai didi

c# - 在继承类中使用锁的最佳实践是什么

转载 作者:可可西里 更新时间:2023-11-01 09:03:32 25 4
gpt4 key购买 nike

我想知道一个类是否继承自另一个类,是让类共享一个在基类定义的锁对象还是在每个继承级别定义一个锁对象更好。

一个非常简单的例子,在类的每一层都有一个锁对象

public class Foo {
private object thisLock = new object();
private int ivalue;

public int Value {
get {
lock( thisLock ) {
return ivalue;
}
}
set {
lock( thisLock ) {
ivalue= value;
}
}
}
}

public class Foo2: Foo {
private object thisLock2 = new object();

public int DoubleValue {
get {
lock( thisLock2 ) {
return base.Value * 2;
}
}
set {
lock( thisLock2 ) {
base.Value = value / 2;
}
}
}
}

public class Foo6: Foo2 {
private object thisLock6 = new object();

public int TripleDoubleValue {
get {
lock( thisLock6 ) {
return base.DoubleValue * 3;
}
}
set {
lock( thisLock6 ) {
base.DoubleValue = value / 3;
}
}
}
}

共享锁对象的一个​​非常简单的例子

public class Foo {
protected object thisLock = new object();
private int ivalue;

public int Value {
get {
lock( thisLock ) {
return ivalue;
}
}
set {
lock( thisLock ) {
ivalue= value;
}
}
}
}

public class Foo2: Foo {
public int DoubleValue {
get {
lock( thisLock ) {
return base.Value * 2;
}
}
set {
lock( thisLock ) {
base.Value = value / 2;
}
}
}
}
public class Foo6: Foo2 {
public int TripleDoubleValue {
get {
lock( thisLock ) {
return base.DoubleValue * 3;
}
}
set {
lock( thisLock ) {
base.DoubleValue = value / 3;
}
}
}
}

哪个示例是在继承类中管理锁定的首选方法?

最佳答案

您可以在 .NET Framework 中经常找到第二个选项,但使用属性而不是字段(例如,CommunicationObject.ThisLock Property):

public class Foo {
private readonly object thisLock = new object();
private int ivalue;

protected object ThisLock {
get {
return thisLock;
}
}

public int Value {
get {
lock( ThisLock ) {
return ivalue;
}
}
set {
lock( ThisLock ) {
ivalue= value;
}
}
}
}

public class Foo2: Foo {     
public int DoubleValue {
get {
lock( ThisLock ) {
return base.Value * 2;
}
}
set {
lock( ThisLock ) {
base.Value = value / 2;
}
}
}
}

关于c# - 在继承类中使用锁的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2883193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com