Tag: 线程安全

java.sql.Connection线程安全吗?

为了改变这个问题:我应该避免共享在不同线程之间实现java.sql.Connection的类的实例吗?

锁如何工作?

我看到,为了使用不是线程安全的对象,我们用这样的一个锁来包装代码: private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } 那么当多个线程访问相同的代码时会发生什么(让我们假设它正在ASP.NET Web应用程序中运行)。 他们排队吗? 如果是的话,他们会等多久? 由于使用锁,对性能的影响是什么?

什么是实现线程安全字典的最佳方式?

我能够通过派生IDictionary和定义一个私有的SyncRoot对象在C#中实现一个线程安全的字典: public class SafeDictionary<TKey, TValue>: IDictionary<TKey, TValue> { private readonly object syncRoot = new object(); private Dictionary<TKey, TValue> d = new Dictionary<TKey, TValue>(); public object SyncRoot { get { return syncRoot; } } public void Add(TKey key, TValue value) { lock (syncRoot) { d.Add(key, value); } } // more IDictionary members… } 然后,我在我的消费者(multithreading)上locking这个SyncRoot对象: 例: lock […]

为什么Java的SimpleDateFormat不是线程安全的?

请用代码示例告诉为什么SimpleDateFormat不是线程安全的。 这个class有什么问题? 是与SimpleDateFormat的格式function的问题 ? 请给出一个在课堂上certificate这个错误的代码。 FastDateFormat是线程安全的。 为什么? SimpleDateFormat和FastDateFormat有什么区别? 请解释说明这个问题的代码?

在C ++ 11中本地静态variables初始化是线程安全的吗?

我知道这是一个经常被问到的问题,但是由于有很多变种,我想重新说明它,并希望有一个反映当前状态的答案。 就像是 Logger& g_logger() { static Logger lg; return lg; } variableslg的构造函数保证只运行一次? 我从以前的答案中知道,在C ++ 03中,这不是; 在C ++ 0x草案中,这是强制执行的。 但我想要一个更清晰的答案 在C ++ 11标准(不是草案)中,线程安全的初始化行为是否已经完成? 如果以上是肯定的,那么在当前stream行编译器的最新版本中,即gcc 4.7,vc 2011和clang 3.0,它们是否被正确实现?

自动执行InvokeRequired代码模式

我已经痛苦地意识到需要多长时间在事件驱动的GUI代码中编写以下代码模式 private void DoGUISwitch() { // cruisin for a bruisin' through exception city object1.Visible = true; object2.Visible = false; } 变为: private void DoGUISwitch() { if (object1.InvokeRequired) { object1.Invoke(new MethodInvoker(() => { DoGUISwitch(); })); } else { object1.Visible = true; object2.Visible = false; } } 这是C#中的一个尴尬模式,既要记住又要键入。 有没有人想出了一些快捷方式或构造,这在一定程度上自动化? 如果有一种方法可以将函数附加到对象上,而不需要经过所有这些额外的工作,比如object1.InvokeIfNecessary.visible = truetypes的快捷方式,那将会很酷。 以前的答案已经讨论过每次只调用Invoke()的不切实际的情况,即使如此,Invoke()语法也是效率低下,处理起来还是尴尬的。 那么,有没有人找出任何捷径?

collections被修改; 枚举操作可能无法执行

我不能深究这个错误,因为当debugging器被连接时,似乎不会发生。 下面是代码。 这是Windows服务中的WCF服务器。 每当有数据事件时,服务就会调用NotifySubscribers方法(以随机间隔,但不常见 – 每天约800次)。 当Windows Forms客户端订阅时,订阅者ID被添加到订阅者字典中,并且当客户端取消订阅时,它从字典中被删除。 错误发生在(或之后)客户端取消订阅。 看起来下一次调用NotifySubscribers()方法时,foreach()循环将失败,并在主题行中发生错误。 该方法将错误写入应用程序日志中,如下面的代码所示。 当一个debugging器被连接并且客户端取消订阅时,代码执行正常。 你看到这个代码有问题吗? 我需要使字典线程安全吗? [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] public class SubscriptionServer : ISubscriptionServer { private static IDictionary<Guid, Subscriber> subscribers; public SubscriptionServer() { subscribers = new Dictionary<Guid, Subscriber>(); } public void NotifySubscribers(DataRecord sr) { foreach(Subscriber s in subscribers.Values) { try { s.Callback.SignalData(sr); } catch (Exception e) { DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error); […]