假设我们有一个集合(Collection),但不能保证它是线程安全的:
var myDic = new Dictionary<string, string>();
在多线程环境下,这将抛出异常:
string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
s = new string('#', 10);
myDic.Add("keyName", s);
}
作为一个线程正在尝试将KeyValuePair添加到字典myDic中,另一个线程可能会调用TryGetValue()。由于集合不能同时读取和写入,因此会发生异常。
然而,另一方面,如果您尝试这样做:
lock (myDic) {
string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
s = new string('#', 10);
myDic.Add("keyName", s);
}
}
突然间,第二个线程尝试获取相同的“keyName”键值时,不必像第一个线程那样将其添加到字典中。
简而言之,线程安全意味着对象支持同时被多个线程使用,或者会适当锁定线程,使您不必担心线程安全性问题。
2. 我认为GhostScript现在不是线程安全的。它主要使用多个线程执行任务,这使其提供了更高的性能,仅此而已。
3. 根据您的预算和要求,它可能是值得的。但是,如果你围绕包装器构建,你可以只在方便的时候使用lock()函数,或者如果你不使用多线程,那么付费获得线程安全显然是不值得的。这意味着,只有当您的应用程序使用多线程时,您才不会遭受库不安全的后果。除非您真正需要多线程,否则不值得为线程安全的库付费。