jjzjj

java - 原子整数 lazySet 性能提升

文章“Atomic*.lazySetisaperformancewinforsinglewriters”介绍了lazySet是一种弱volatile写入(从某种意义上说,它充当存储存储而不是存储加载栅栏)。但我不明白如何利用半volatile写入来提高并发队列性能。它究竟是如何提供超低延迟的claimedbyMenta-queue?我已经阅读了它的实现及其对堆栈溢出问题的声明:“HowislazySetinJava'sAtomic*classesimplemented”和“AtomicInteger'slazySetvsset”。 最佳答案

java - 单例对象工厂 : is this code thread-safe?

我有一个用于许多单例实现的通用接口(interface)。接口(interface)定义了可以抛出检查异常的初始化方法。我需要一个工厂来按需返回缓存的单例实现,想知道以下方法是否线程安全?UPDATE1:请不要建议任何第三部分库,因为由于可能的许可问题,这将需要获得法律许可:-)更新2:此代码可能会在EJB环境中使用,因此最好不要产生额外的线程或使用类似的东西。interfaceSingleton{voidinit()throwsSingletonException;}publicclassSingletonFactory{privatestaticConcurrentMap>CACH

java - volatile 为什么以及如何暗示原子读/写?

首先,我知道volatile不会使多个操作(如i++)成为原子操作。这个问题是关于单个读取或写入操作。我最初的理解是volatile只强制执行内存屏障(即其他线程将能够看到更新的值)。现在我注意到JLSsection17.7说volatile还使单个读取或写入成为原子。例如,给定两个线程,都将不同的值写入volatilelongx,那么x最终将恰好代表其中一个值。我很好奇这怎么可能。在32位系统上,如果两个线程并行写入64位位置并且没有“适当的”同步(即某种锁),结果可能会混淆。为清楚起见,我们使用一个示例,其中线程1写入0L而线程2将-1L写入相同的64位内存位置。T1writesl

java - Perl 共享变量的原子性和可见性

这是我从threads::shared上读到的描述:Bydefault,variablesareprivatetoeachthread,andeachnewlycreatedthreadgetsaprivatecopyofeachexistingvariable.Thismoduleallowsyoutosharevariablesacrossdifferentthreads...(more)假设我有一个这样的共享变量:my$var:shared;$var=10;这意味着对于我创建的所有线程,该变量只存在一次。现在关于原子性和可见性:如果thread_A分配了一个新值,比如说11:$v

java - Java Atomics 是否只需要相对于 VM 的原子性

我查看了AtomicInteger类(找到here)的Java源代码,以了解实现JVM需要哪些原子原语。我注意到他们使用未记录的UnsafeAPI来实现他们的原子整数操作,他们使用的唯一两个原语似乎是compareandswap和compareandset操作。并且Unsafe类将这些指令实现为本地方法,这让我相信他们正在使用在一般情况下执行这些原始操作的本地指令。然而,并非每个处理器(尽管大多数现代处理器都有)都有一个原生支持这些原语的指令集。现在,即使没有native处理器支持,这些原语也可以由VM以保证与其他VM线程的原子性的方式实现,但不一定与其他native线程。那么java

java - AtomicLong 的 incrementAndGet 方法在内部如何工作?

我在我的多线程代码中使用AtomicLong的incrementAndGet方法来测量我们的一些客户端代码的性能。@Overridepublicvoidrun(){longstart=System.nanoTime();attributes=client.getAttributes(columnsList);longend=System.nanoTime()-start;finalAtomicLongbefore=select.putIfAbsent(end/1000000L,newAtomicLong(1L));if(before!=null){before.incrementAnd

java - 对数组和数组元素的 AtomicReference 更改可见性

Java是否保证线程A在将数组引用存储在AtomicReference之前对数组元素所做的更新将始终对线程B获取此引用?换句话说,执行此操作的可能输出是什么:classReferences{AtomicReferencerefs=newAtomicReference(newString[]{"first"});publicvoidadd(Strings){refs.updateAndGet(oldRefs->{String[]newRefs=newString[oldRefs.length+1];System.arraycopy(oldRefs,0,newRefs,0,oldRefs.

Java: get+clear atomic for map

我想实现以下逻辑:-将使用以下结构//Mapkeepingthependingupdates//groupedbytheidoftheupdatedobjectfinalMap>updatesPerId=newConcurrentHashMap();-n个生产者会向updatesPerIdmap添加更新(对于同一个id,可以同时添加2个更新)-oneTimerThread会时不时地运行,并且必须处理接收到的更新。像这样的东西:finalMap>toBeProcessed=newHashMap(updatesPerId);updatesPerId.clear();//iterateove

Java volatile 和副作用

Oracle关于原子访问的文档(位于http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)是这样说的:"avolatilevariableestablishesahappens-beforerelationship....Thismeansthat...whenathreadreadsavolatilevariable,itseesnotjustthelatestchangetothevolatile,butalsothesideeffectsofthecodethatledupthechang

java - 原子长操作

我需要执行以下操作://average,total,elapsedareLong'saverage=((total*average)+elapsed)/(++total);但是我想用AtomicLong这是我正在尝试的,但我不太明白它是否正确:average.set(((total.get()*average.get())+elapsed)/total.getAndIncrement());我如何判断这是否正确? 最佳答案 推测您正在使用AtomicLong,因为这些数字正在被同时访问。由于涉及两个数字,并且在同一语句中同时使用ge