在sun.misc包中,我在Unsafe类下看到了这些方法。publicfinalnativebooleancompareAndSwapObject(Objectvar1,longvar2,Objectvar4,Objectvar5);publicfinalnativebooleancompareAndSwapInt(Objectvar1,longvar2,intvar4,intvar5);publicfinalnativebooleancompareAndSwapLong(Objectvar1,longvar2,longvar4,longvar6);这些方法似乎是原子的并且是用C编写
假设以下两个计数器实现:classCounter{privatefinalAtomicIntegeratomic=newAtomicInteger(0);privateinti=0;publicvoidincrementAtomic(){atomic.incrementAndGet();}publicsynchronizedvoidincrement(){i++;}}乍一看,原子应该更快,更具可扩展性。他们是,我相信。但是它们总是比synchronizedblock快吗?或者当这个规则被打破时存在某些情况(例如SMP/单CPU机器、不同的CPUISA、操作系统等)?
我有一个写入线程和一个读取线程来更新和处理数组池(存储在映射中的引用)。写入与读取的比率几乎为5:1(写入延迟是一个问题)。编写器线程需要根据一些事件更新池中数组的几个元素。整个写操作(所有元素)需要是原子的。如果写入线程正在更新它(类似于volatile但在整个数组而不是单个字段上),我想确保读取线程读取先前更新的数组。基本上,我可以读取陈旧的值但不会阻塞。此外,由于写入非常频繁,因此在读/写时创建新对象或锁定整个数组的开销非常大。是否可以使用更高效的数据结构或使用更便宜的锁? 最佳答案 这个想法怎么样:编写器线程不会改变数组。它
我正在努力学习并更好地理解多线程,但我对获取和添加等原子函数的行为很着迷。在fetch-and-add的特定情况下,我的理解是一个值(假设x当前等于5)被增加一个增量值(假设3),结果和(8)被写入x的放在内存中,但返回旧值(5)。在不同的地方(如OpenGL的原子函数、Java的AtomicIntegers以及更多领域)还有其他几个这样的函数具有类似的行为。但我不明白的是,为什么代码中的某个地方想要写入内存,但仍然返回它首先想要修改的值。任何人都可以帮助阐明这一点吗? 最佳答案 答案很简单。原子函数的本质是它们修改(在本例中为增量
我想知道是否需要同步或使用并发类,或者相反,如果对map的唯一修改正在改变,那么在多线程环境中使用非并发类并且不对map进行同步是否线程安全map的值。我问这个的原因是HashMap(和其他非并发映射文档)有这样的评论:Notethatthisimplementationisnotsynchronized.Ifmultiplethreadsaccessahashmapconcurrently,andatleastoneofthethreadsmodifiesthemapstructurally,itmustbesynchronizedexternally.(Astructuralmod
我有一个计数器类,它有递增和递减方法,这两个方法是同步的。publicclassCounter{intcount=0;publicsynchronizedvoidincrement(){count++;}publicsynchronizedvoiddecrement(){count--;}}从这个例子中可以很清楚地看出竞争条件不会发生,只有一个线程可以访问递增或递减方法。现在,如果我用AtomicInteger修改计数器类并删除synchronized关键字,而不是整数基元,我们可以实现同样的事情吗?publicclassCounter{AtomicIntegercount=newAt
我正在浏览java.util.concurrent.atomic.AtomicInteger的源代码,以了解该类提供的原子操作是如何实现原子性的。例如AtomicInteger.getAndIncrement()方法源码如下publicfinalintgetAndIncrement(){for(;;){intcurrent=get();intnext=current+1;if(compareAndSet(current,next))returncurrent;}}我无法理解在无限循环中编写操作序列的目的。它在Java内存模型(JMM)中是否有任何特殊用途。请帮我找到一个描述性的理解。提
据我所知,引用分配在64位JVM中是原子的。现在,我假设jvm在内部不使用原子指针对此进行建模,否则就不需要原子引用。所以我的问题是:原子引用赋值是否在java/Scala的“规范”中并保证会发生,或者大多数时候都是这样只是一个快乐的巧合?对于编译为JVM字节码的任何语言(例如clojure、Groovy、JRuby、JPython等),是否隐含了原子引用分配?如果不在内部使用原子指针,引用赋值如何成为原子的? 最佳答案 首先,引用分配是原子的,因为规范是这么说的。除此之外,JVM实现者实现此约束没有任何障碍,因为64位引用通常仅用
我读过Oracledocs那:Readsandwritesareatomicforreferencevariablesandformostprimitivevariables(alltypesexceptlonganddouble).(我猜这个特性已经被添加到一些新的JDK版本中,因为我曾经认为所有原始变量的读/写都不是原子的)这是否意味着AtomicInteger已被弃用并且不应在新项目中使用? 最佳答案 虽然从普通int中单个存储或单个加载在Java中是原子的,但您不能以原子方式递增它.这样做需要您首先加载该值,然后根据它计算新
我知道在没有锁定的情况下,增量操作在C++中不是原子的。JVM会在其iinc指令的实现上加任何锁吗? 最佳答案 不,不是获取c的当前值。将检索到的值增加1。将增量值存储回c。JavaDocumentationforAtomicityandThreadInterference您需要使用synchronized关键字或使用AtomicXXX线程安全方法。更新:publicsynchronizedvoidincrement(){c++;}或AtomicIntegerinteger=newAtomicInteger(1);//somewhe