草庐IT

java - 原子变量与同步方法

我有一个计数器类,它有递增和递减方法,这两个方法是同步的。publicclassCounter{intcount=0;publicsynchronizedvoidincrement(){count++;}publicsynchronizedvoiddecrement(){count--;}}从这个例子中可以很清楚地看出竞争条件不会发生,只有一个线程可以访问递增或递减方法。现在,如果我用AtomicInteger修改计数器类并删除synchronized关键字,而不是整数基元,我们可以实现同样的事情吗?publicclassCounter{AtomicIntegercount=newAt

java - 如何在 java.util.concurrent.atomic 包中定义的类中实现原子性?

我正在浏览java.util.concurrent.atomic.AtomicInteger的源代码,以了解该类提供的原子操作是如何实现原子性的。例如AtomicInteger.getAndIncrement()方法源码如下publicfinalintgetAndIncrement(){for(;;){intcurrent=get();intnext=current+1;if(compareAndSet(current,next))returncurrent;}}我无法理解在无限循环中编写操作序列的目的。它在Java内存模型(JMM)中是否有任何特殊用途。请帮我找到一个描述性的理解。提

java - 为什么在 Java 中引用赋值是原子的?

据我所知,引用分配在64位JVM中是原子的。现在,我假设jvm在内部不使用原子指针对此进行建模,否则就不需要原子引用。所以我的问题是:原子引用赋值是否在java/Scala的“规范”中并保证会发生,或者大多数时候都是这样只是一个快乐的巧合?对于编译为JVM字节码的任何语言(例如clojure、Groovy、JRuby、JPython等),是否隐含了原子引用分配?如果不在内部使用原子指针,引用赋值如何成为原子的? 最佳答案 首先,引用分配是原子的,因为规范是这么说的。除此之外,JVM实现者实现此约束没有任何障碍,因为64位引用通常仅用

java - 如果对 int 变量的写入和读取是原子的,为什么需要 AtomicInteger?

我读过Oracledocs那:Readsandwritesareatomicforreferencevariablesandformostprimitivevariables(alltypesexceptlonganddouble).(我猜这个特性已经被添加到一些新的JDK版本中,因为我曾经认为所有原始变量的读/写都不是原子的)这是否意味着AtomicInteger已被弃用并且不应在新项目中使用? 最佳答案 虽然从普通int中单个存储或单个加载在Java中是原子的,但您不能以原子方式递增它.这样做需要您首先加载该值,然后根据它计算新

java - iinc在Java中是原子的吗?

我知道在没有锁定的情况下,增量操作在C++中不是原子的。JVM会在其iinc指令的实现上加任何锁吗? 最佳答案 不,不是获取c的当前值。将检索到的值增加1。将增量值存储回c。JavaDocumentationforAtomicityandThreadInterference您需要使用synchronized关键字或使用AtomicXXX线程安全方法。更新:publicsynchronizedvoidincrement(){c++;}或AtomicIntegerinteger=newAtomicInteger(1);//somewhe

java - Java 中 java.util.concurrent.atomic 包中类的确切用途是什么?

我是比较新的java。我试图了解包中类的用法:java.util.concurrent.atomic我试图了解这个包的javaDoc以掌握它。但是当我应该使用这些类时,它真的没有任何意义。有人可以用简单的话举例和更多描述吗?谢谢 最佳答案 考虑10个线程递增inti(初始化为0)并将值输出到控制台。你可以得到这样的东西:12233566810例如,AtomicInteger可确保每个线程都可以原子地递增或递减值,从而确保写入操作以同步方式发生,对于10个线程,输出始终为:12345678910

java - 非数据库应用事务

如何将非数据库操作封装到事务中?例如,假设我有一些顺序调用的方法/函数,一些更新数据库,一些更新文件系统上的文件,一些更新HttpSession中的参数,一些更新缓存等。如果是后者那些失败了,比如更新session,我如何回滚文件系统、数据库等中的所有其他更改?环境是一个JavaServlet容器,如Tomcat,带有Struts2之类的东西,任何RDBMS,一个持久层,如Hibernate或Ibatis,等等。 最佳答案 所有这些都必须是事务性资源,能够参与两阶段提交协议(protocol),以便执行您想要的操作。除非您的代码中有

java - 字节码指令和处理器操作之间的关系

Java规范保证原始变量赋值始终是原子的(long和double类型除外。相反,Fetch-and-Add对应于著名的i++增量操作的操作将是非原子的,因为会导致读取-修改-写入操作。假设这段代码:publicvoidassign(intb){inta=b;}生成的字节码是:publicvoidassign(int);Code:0:iload_11:istore_22:return因此,我们看到分配由两个步骤(加载和存储)组成。假设这段代码:publicvoidassign(intb){inti=b++;}字节码:publicvoidassign(int);Code:0:iload_1

java - ThreadLocal<AtomicInteger> 可能有用吗?

所以我只是sawsomeonetrytouse一个ThreadLocal在一些Java代码中。现在,对于链接代码,这显然是无用的,还有导致请求被拒绝的其他问题。而且它似乎总是没用:AtomicInteger(来自java.util.concurrent.atomic包)专为多线程访问而设计,ThreadLocal使每个线程都有自己的值(value),那么为什么还要使用它呢?我的问题是:是否有任何情况下ThreadLocal会有用吗? 最佳答案 是的,我们可能会想出一个合理的场景:在每个任务开始时,我们需要一个AtomicIntege

java - int 基本类型的 volatile 声明

我在AtomicAccess上引用了Oracle的Java文档Readsandwritesareatomicforreferencevariablesandformostprimitivevariables(alltypesexceptlonganddouble).Readsandwritesareatomicforallvariablesdeclaredvolatile(includinglonganddoublevariables).我了解volatile的工作原理。但是提到需要为long和double变量显式声明volatile以在第二个语句中获得原子访问,这使得volatile