Questions tagged «thread-safety»

如果一段代码仅以允许多个线程一致地执行此代码的方式操作数据结构,则它是线程安全的。代码可能是线程安全的,有条件的安全(需要互斥)或不安全的(只能由一个线程安全使用)。

16
集合已修改;枚举操作可能无法执行
我无法弄清此错误的原因,因为在附加调试器后,似乎没有发生此错误。下面是代码。 这是Windows服务中的WCF服务器。每当有数据事件时,服务就会调用NotifySubscribers方法(以随机间隔,但不是很频繁-每天大约800次)。 Windows Forms客户端进行预订时,订户ID被添加到订户字典中,而当客户端取消订阅时,将从该词典中删除它。该错误发生在客户退订时(或之后)。看来,下次调用NotifySubscribers()方法时,foreach()循环会失败,并在主题行中出现错误。该方法将错误写入应用程序日志,如下面的代码所示。当附加了调试器并且客户端取消订阅时,代码将正常执行。 您看到此代码有问题吗?我需要使字典具有线程安全性吗? [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); UnsubscribeEvent(s.ClientId); } } } …


8
锁到底如何工作?
我看到对于使用不是线程安全的对象,我们使用如下锁将代码包装起来: private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } 因此,当多个线程访问同一代码时会发生什么(假设它在ASP.NET Web应用程序中运行)。他们排队了吗?如果是这样,他们将等待多长时间? 使用锁会对性能产生什么影响?

3
RxJava调度程序的用例
在RxJava中,有5种不同的调度程序可供选择: Immediate():创建并返回一个Scheduler,该Scheduler立即在当前线程上执行工作。 trampoline():创建并返回一个调度程序,该调度程序在当前工作完成后将要在当前线程上执行的工作排队。 newThread():创建并返回一个Scheduler,该Scheduler为每个工作单元创建一个新的Thread。 Calculation():创建并返回用于计算工作的Scheduler。这可以用于事件循环,处理回调和其他计算工作。不要在此调度程序上执行IO绑定工作。使用计划程序。io()代替。 io():创建并返回用于IO绑定工作的Scheduler。该实现由Executor线程池支持,该线程池将根据需要增长。这可用于异步执行阻塞IO。不要在此调度程序上执行计算工作。使用计划程序。Calculation()代替。 问题: 前三个调度程序很容易说明。但是,我对计算和io有点困惑。 什么是“ IO绑定工作”?它用于处理流(java.io)和文件(java.nio.files)吗?它用于数据库查询吗?它是否用于下载文件或访问REST API? 如何计算()从不同newThread() ?是否所有的Calculation()调用都在单个(后台)线程上,而不是每次都在一个新的(后台)线程上? 为什么在进行IO工作时调用calculation()很糟糕? 为什么在执行计算工作时调用io()不好?

7
可重入函数到底是什么?
大多数 的 的 时代,再进入的定义转引自维基百科: 如果一个计算机程序或例程可以在之前的调用完成之前安全地再次调用(即可以安全地同时执行),则称为可重入 。要重入,可以使用计算机程序或例程: 必须不包含静态(或全局)非恒定数据。 不得将地址返回静态(或全局)非恒定数据。 必须仅对调用方提供的数据起作用。 绝对不能依赖于对单例资源的锁定。 不得修改自己的代码(除非在自己的唯一线程存储中执行) 不得调用非可重入计算机程序或例程。 如何安全定义? 如果一个程序可以安全地并发执行,是否总是意味着它是可重入的? 在检查代码的可重入功能时,应牢记的六点之间的共同点到底是什么? 也, 所有递归函数都是可重入的吗? 所有线程安全函数都可重入吗? 所有递归和线程安全函数都可以重入吗? 在写这个问题时,会想到一件事:再入和线程安全之类的术语是绝对绝对的,即它们是否具有固定的具体定义?因为,如果不是这样的话,这个问题就没有太大意义。

11
Java同步方法锁定对象还是方法?
如果我在同一个类中有2个同步方法,但是每个方法都访问不同的变量,那么2个线程可以同时访问这2个方法吗?锁是否发生在对象上,或者是否与同步方法中的变量一样具体? 例: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2个线程可以访问类X执行相同的实例x.addA(),并x.addB()在同一时间?

7
Queue.Queue与collections.deque
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以读取。 Python至少有两个队列类,Queue.Queue和collections.deque,前者似乎在内部使用后者。两者都声称在文档中是线程安全的。 但是,队列文档还指出: collections.deque是具有无限原子append()和popleft()操作的无界队列的替代实现,不需要锁定。 我猜我不太理解:这是否意味着双端队列毕竟不是完全线程安全的? 如果是这样,我可能无法完全理解两个类之间的区别。我可以看到Queue添加了阻止功能。另一方面,它失去了一些过时的功能,例如对操作员的支持。 直接访问内部双端队列对象是 Queue()中的x 线程安全的? 另外,当双端队列已经是线程安全的了,为什么Queue在操作上使用互斥锁?

9
自动执行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 = true类型快捷方式)的方法,那将很酷。 先前的答案已经讨论了每次调用Invoke()都是不切实际的,即使这样,Invoke()语法效率低下,仍然难以处理。 那么,有人知道快捷方式吗?

4
是什么使方法具有线程安全性?都有些什么样的规矩?
是否存在使线程安全的方法的总体规则/准则?我了解可能有上百万种一次性情况,但总的来说呢?这样简单吗? 如果方法仅访问局部变量,则它是线程安全的。 是吗 那也适用于静态方法吗? @Cybis提供的一个答案是: 局部变量不能在线程之间共享,因为每个线程都有自己的堆栈。 静态方法也是如此吗? 如果将方法传递给引用对象,是否会破坏线程安全性?我已经做过一些研究,关于某些情况,有很多东西,但是我希望能够仅使用一些规则来定义遵循准则,以确保方法是线程安全的。 因此,我想我的最终问题是:“是否有一小段定义线程安全方法的规则?如果是,它们是什么?” 编辑 在这里已经提出了很多优点。我认为这个问题的真正答案是:“没有简单的规则可以确保线程安全。” 凉。精细。但总的来说,我认为接受的答案提供了一个很好的简短摘要。总是有例外。就这样吧。我可以忍受这一点。
156 c#  thread-safety 

5
迭代ConcurrentHashMap值线程安全吗?
在javadoc中,ConcurrentHashMap如下: 检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。检索反映了自发生以来最新完成的更新操作的结果。对于诸如putAll和clear的聚合操作,并发检索可能仅反映某些条目的插入或删除。同样,迭代器和枚举返回的元素反映了在创建迭代器/枚举时或此后某个时刻哈希表的状态。他们不抛出ConcurrentModificationException。但是,迭代器被设计为一次只能由一个线程使用。 这是什么意思?如果我尝试同时使用两个线程迭代地图,会发生什么情况?如果在迭代过程中从地图上放置或删除值会怎样?

5
.NET Framework中并发HashSet <T>?
我有以下课程。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); } 我需要从不同的线程更改字段“数据”,所以我想对当前的线程安全实现提出一些意见。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } 有没有更好的解决方案,可以直接进入现场并保护它免受多个线程的并发访问?


5
如果非同步静态方法不修改静态类变量,它们是否安全?
我在想,如果您有一个静态方法不同步,但并没有修改任何静态变量是线程安全的?如果该方法在其中创建局部变量该怎么办?例如,以下代码是线程安全的吗? public static String[] makeStringArray( String a, String b ){ return new String[]{ a, b }; } 因此,如果我有两个线程连续并同时调用此方法,一个带狗(例如“大丹狗”和“斗牛犬”),另一个带猫(例如“波斯”和“暹罗”)的猫,我将得到猫和狗在同一阵列中?还是猫和狗永远不会同时处于该方法的同一调用中?

8
!=检查线程安全吗?
我知道诸如之类的复合操作i++不是线程安全的,因为它们涉及多个操作。 但是,检查引用本身是否是线程安全的操作? a != a //is this thread-safe 我尝试对此进行编程,并使用多个线程,但没有失败。我想我无法在机器上模拟种族。 编辑: public class TestThreadSafety { private Object a = new Object(); public static void main(String[] args) { final TestThreadSafety instance = new TestThreadSafety(); Thread testingReferenceThread = new Thread(new Runnable() { @Override public void run() { long countOfIterations = 0L; while(true){ boolean …

4
是否可以将Gson实例用作模型bean中的静态字段(重用)?
这是我实现的模型: public class LoginSession { private static final Gson gson = new Gson(); private String id; private String name; private long timestamp; public LoginSession(String id, String name) { this.id = id; this.name = name; this.timestamp = System.currentTimeMillis(); } public String toJson() { return gson.toJson(this); } public static LoginSession fromJson(String json) …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.