当我们使用一个内置队列,如ConprestLinkedQueue甚至一些BlockingQueue时,单个调用是原子的,并保证是线程安全的。但是当对API的5次调用中,有4次调用是单个调用时,但有一次调用的形式是:
if(some condition)
{
queue.call();
}
这个调用需要在一个同步块中,因为这个操作是非原子的。但是引入这个调用不也意味着从此以后对这个队列的所有访问,不管是读还是写,都应该同步吗?
如果是,我可以假设一旦代码中出现单个非原子调用(这很有可能),那么所有对花式队列的访问都必须手动同步吗?
ConprestLinkedQueue
不会做出与您假设的完全相同的原子保证。来自javadoc:
内存一致性影响:与其他并发集合一样,在将对象放入ConcurrentLinkedQueue之前,线程中的操作发生在另一个线程中访问或删除该元素之后的操作之前。
这与包装链接列表
或集合
列表中的内容不同;例如,不同的线程可能会看到 size()
的不同答案,因为它不会锁定集合。
根据您的注释,您可能可以将if语句替换为对Queue
的轮询
的单个调用,并检查检索到的元素是否为null。
问题内容: 有没有办法在非UI线程中进行UI更改?简短的问题。 问题答案: 如果您不想使用AsyncTask,请在您的主要活动中尝试使用带有内部类(ResponseHandler)的观察者模式,对不起,我无法正确设置格式,但是我确定您知道
本文向大家介绍C#中使用Interlocked进行原子操作的技巧,包括了C#中使用Interlocked进行原子操作的技巧的使用技巧和注意事项,需要的朋友参考一下 什么是原子操作? 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在C#中有多个线程同时对某个变量进行操作的时候,我们应该使用原子操作,防止多线
问题内容: 我需要先选择(假设)数据库中的10000行并将其返回。可能有更多的客户端一次执行此操作。我想出了这个查询: 这是一个由更新和嵌套选择组成的操作。这两个查询都在同一表(tblRedir)上工作。这个想法是,这些行首先用唯一的batchId进行标记,然后通过进行返回 (对于每个此更新,batchid是唯一的标识符(例如,时间戳或guid)) 我的问题: 我认为 使用嵌套选择进行 的操作 更
我想以无原子锁的方式使用ConcurrentLinkedQueue: 几个并发线程将事件推送到队列中,其他一些线程将处理它们。队列没有绑定,我不希望任何线程等待或被锁定。然而,阅读部分可能会注意到队列变空了。在无锁实现中,读取线程不能阻塞,只能结束其任务并继续执行其他任务(即作为ExecutorService)。因此,将第一个新事件推送到空队列中的写入程序必须知道它,并且应该重新启动读取器(即,通
问题内容: Java中的哪些操作被视为原子操作? 问题答案: 除long和double以外的所有基本类型分配 所有参考文献的分配 易变变量的所有分配 java.concurrent.Atomic 类的所有操作 也许还有更多。看看jls。 如评论中所述,原子性并不意味着可见性。因此int,即使保证另一个线程看不到部分写入的内容,也可能永远看不到新值。
问题内容: 如何在Java中使用? 使用此方法,我是否需要担心队列中的并发性?还是只需要定义两种方法(一种方法是从列表中检索元素,另一种方法是将元素添加到列表中)? 注意:显然,这两种方法必须同步。对? 编辑: 我想做的是:我有一类(在Java中),其中一种方法可从队列中检索项目,而另一类具有一种方法可将项目添加至队列。从列表中添加和检索的项目是我自己类的对象。 另一个问题:我需要在remove方