关于一次从多个线程访问局部变量的几个问题:
> < li>
我有多个线程写入和读取变量值,我是否应该同步访问它?
变量每隔几秒钟从 Thread1 更新一次,每隔几秒钟从 Thread2 读取和更新到数据库。
如果我没有任何逻辑并且没有任何并发问题,会出现哪些问题?
我应该为此使用volatile吗?
编辑:
我想强调的是,我没有任何并发问题。这是我的具体方案:
一个。我的变量名称是 pingLatency
,它测量 ping 延迟
b、 线程1每10秒发送一次ping到8.8.8.8,并将延迟写入pingLatency
c. Thread2 每 10 秒更新一个具有 pingLatency
值的相关字段。
d. Thread2 每次更新相同的数据库行。
现在,我正在使用这个数据库字段来监控网络连接。我的问题是-是否会出现变量未更新或由于线程安全问题而引发异常的情况?我想避免使用lock
,因为它看起来太过分了。
你怎么想呢?
如果对变量的访问是原子性的,并且没有逻辑问题,那就没问题。根据这个你可以知道你是否使用了原子变量。
如果你愿意。NET托管并行使用内置的好东西。任务并行。这将为您管理线程,您可以使用内置的线程安全变量,就像数组/列表等同于ConcurrentBag等。
易失性
,根据Eric Lippert的说法,它过于复杂,语义非常奇怪。小心不要打破内存模型,C#基本上跟大多数其他语言一样,对无数据竞争的程序使用顺序一致性(SC-DRF)。Volatile打破了这一点,所以只需使用锁来防止数据竞争。
至于lock
,它并不像人们想象的那么重,在大多数情况下,在您想象的场景中不会争夺锁。因此,在大多数情况下,获取锁应该是无痛的。
问题内容: 好吧,考虑下面给出的不可变类: 现在,我正在一个类中创建一个对象,该对象的对象将由多个线程共享: 看到as 并移入同步块并创建对象。现在,由于 Java内存模型(JMM)允许多个线程在初始化开始之后但尚未结束之前观察对象。 因此,可以将写入操作视为在写入的字段之前发生。因此,因此可以看到部分构造,该构造很可能处于无效状态,并且其状态以后可能会意外更改。 它不是非线程安全的吗? 编辑 好
类OneValueCache是不可变的。但是我们可以更改变量缓存的引用。 但我不能理解为什么VolateCachedFactorizer类是线程安全的。 对于两个线程(线程A和线程B),如果线程A和线程B同时到达,那么两个线程A和B都将尝试创建OnEvalueCache。然后线程A到达而线程B同时到达。然后线程A将创建一个,它覆盖threadB创建的值(OneValueChange是不可变的,但是
本文向大家介绍C++ 线程安全信号,包括了C++ 线程安全信号的使用技巧和注意事项,需要的朋友参考一下 示例 C ++ 11 C ++ 11标准保证以同步方式初始化函数作用域对象的初始化。这可以用于通过延迟初始化实现线程安全的单例。
有没有其他的方法来保证线程安全呢?
问题内容: 给出以下代码: 线程类将定期(通过执行器每5分钟更新一次)myConfigData成员变量。myConfigData的设置是否在“外部”线程中是线程安全的(原子的),还是我必须将每个读写操作都同步到myConfigData变量? 编辑:问题不是ConcurrentHashMap是否是线程安全的(根据Javadoc),而是ConcurrentHashMap本身在myConfigData
问题内容: 如果您在同一文件描述符中的两个不同线程中调用(或,或两者兼有)会发生什么情况(让我们说我们对本地文件感兴趣,而这是套接字文件描述符),而没有显式使用同步机制? 读取和写入是系统调用,因此,在一个单核CPU上,不幸的是两次读取将“同时”执行。但是有多个核心… linux内核会做什么? 让我们更笼统一点:其他内核(例如BSD)的行为是否总是相同? 编辑:根据密切的文档,我们应该确保文件描述