gpt4 book ai didi

.net - 线程安全的一次计算最佳实践

转载 作者:行者123 更新时间:2023-12-03 13:18:12 25 4
gpt4 key购买 nike

在类中需要一个需要计算和缓存的属性是很常见的。

通常,我使用锁和 bool 值顶部检查是否已处理。有时我会在访问器中执行此操作。

这种方法对性能有何影响?有没有更好的办法了。

我对此的常用方法的示例代码:

   Sub Main()
Dim X AS New X()

For i AS Integer = 0 To 50
Dim Thr AS New Threading.Thread(ADdressOF X.ProcessData )
Thr.Start()
Next

End Sub

Private Class X

Private DataCached AS Boolean
Private ProcessedData AS String
Private Lock AS New Object()
Public Function ProcessData() AS String

Synclock Lock
IF NOT DataCached Then
DataCached = True
ProcessedData = DoStuff()
End If
End Synclock

Console.Writeline(ProcessedData)
Return ProcessedData
End Function


Function DoStuff() AS String
Threading.Thread.Sleep(1000)
Console.Writeline("Processed")
return "stuff"
End Function

End Class

编辑:

这是在访问时需要计算的内容,因为它一直在变化。构造函数的计算在这里无济于事。 (示例是我正在做的一个非常简化的版本)

最佳答案

从未两次计算是否至关重要?即如果两个线程碰巧同时请求它,并独立地计算值,那是制止器吗?在大多数情况下,不是-在这种情况下,只需检查null(因为它是字符串):(在C#中为示例,抱歉):

   if(processedData == null) {
processedData = DoStuff();
}
return processedData;

所有后续调用都应看到新值(如果隐藏在属性/方法中,我认为不需要 volatile)。

这具有无锁且简单的优点。

另一个技巧是使用嵌套类的静态属性:
string SomeValue {
get {return MyCache.SomeValue;}
}
static class MyCache {
public static readonly string SomeValue;
static MyCache() {
SomeValue = DoStuff();
}
}

这是延迟计算的,但是静态初始化程序的规则意味着可以保证仅运行一次(不包括反射)。

关于.net - 线程安全的一次计算最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/718675/

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