这个问题中的 while 循环是线程安全的:AtomicInteger thread safety。如果我在线程安全的 while 循环中插入 randomSum 方法,代码是否仍然是线程安全的?还是应该同步 randomSum 方法?
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
public class Print implements Runnable {
static AtomicInteger atomicInteger = new AtomicInteger(0);
static Random random = new Random(1);
public static int randomSum() {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += random.nextInt();
}
return sum;
}
@Override
public void run() {
while (atomicInteger.getAndIncrement() < 100)
System.out.println(randomSum() + " " + Thread.currentThread());
}
public …Run Code Online (Sandbox Code Playgroud) AtomicIntegerclass有2个方法,get()并intValue()有以下定义.
intValue() 定义:
/**
* Returns the value of this {@code AtomicInteger} as an {@code int}.
*/
public int intValue() {
return get();
}
Run Code Online (Sandbox Code Playgroud)
get() 定义:
/**
* Gets the current value.
*
* @return the current value
*/
public final int get() {
return value;
}
Run Code Online (Sandbox Code Playgroud)
有一个非最终方法intValue()有什么好处?出于所有实际目的,如果我没有错,我们可以使用get方法.请解释这种做法是否有任何好处.
我尝试 使用hibernate java 框架持久保存一个具有AtomicInteger变量而不是Integer 的对象(保存后我需要在线程安全场景中使用该对象),但是当我尝试保存我的对象时,java 抛出:
java.lang.ClassCastException: java.util.concurrent.atomic.AtomicInteger cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
有什么方法可以将 AtomicInteger 映射到整数吗?有一个对象的例子:
public class Statistics implements java.io.Serializable {
private AtomicInteger id;
private AtomicInteger totalErrors;
public Statistics() {
}
public AtomicInteger getTotalErrors() {
return this.totalErrors;
}
public void seTotalErrors(AtomicInteger totalErrors) {
this.totalErrors= totalErrors;
}
}
Run Code Online (Sandbox Code Playgroud)
以及相应的 POJO xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Statistics" table="statistics" catalog="example" optimistic-lock="version">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator …Run Code Online (Sandbox Code Playgroud) 我有以下JUnit测试,并且无法解决为什么第二个测试没有通过,i两个测试中的值都是1.
public class TestTest {
private AtomicInteger ai = new AtomicInteger(1);
@Test
public void test1() {
int i = ai.getAndIncrement();
Assert.assertEquals(1, i);
}
@Test
public void test2() {
int i = ai.getAndIncrement();
Assert.assertEquals(2, i);
}
}
Run Code Online (Sandbox Code Playgroud)
test1传递并test2失败,并显示以下消息:
java.lang.AssertionError:
Expected :2
Actual :1
Run Code Online (Sandbox Code Playgroud)