AtomicReference<V> is an object reference that may be updated atomically.
Examples
AtomiceReference of Double
Since there's no class like AtomicDouble, we can use AtomicReference to wrap the Double.
package com.logicbig.example;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceExample {
private static AtomicReference<Double> sum = new AtomicReference<>();
public static void main(String[] args) throws InterruptedException {
for (int k = 0; k < 5; k++) {
sum.set(0d);
ExecutorService es = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 50; i++) {
int finalI = i;
es.execute(() -> {
sum.accumulateAndGet(Math.pow(1.5, finalI),
(d1, d2) -> d1 + d2);
});
}
es.shutdown();
es.awaitTermination(10, TimeUnit.MINUTES);
System.out.println(sum.get());
}
}
}
1.9128644976421487E9 1.9128644976421487E9 1.9128644976421487E9 1.9128644976421487E9 1.9128644976421487E9
Without AtomicReference
package com.logicbig.example;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class NoAtomicReferenceExample {
private static Double sum;
public static void main(String[] args) throws InterruptedException {
for (int k = 0; k < 5; k++) {
sum=0d;
ExecutorService es = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 50; i++) {
int finalI = i;
es.execute(() -> {
sum+=Math.pow(1.5, finalI);
});
}
es.shutdown();
es.awaitTermination(10, TimeUnit.MINUTES);
System.out.println(sum);
}
}
}
1.9128638628787515E9 1.9128644976421487E9 1.9128476635299528E9 1.9128644976421487E9 1.8879854999200337E9
The result is not always same.
AtomicReference of BigDecimal
package com.logicbig.example;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceExample2 {
private static AtomicReference<BigDecimal> sum = new AtomicReference<>();
public static void main(String[] args) throws InterruptedException {
for (int k = 0; k < 5; k++) {
sum.set(BigDecimal.ZERO);
ExecutorService es = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 50; i++) {
int finalI = i;
es.execute(() -> {
sum.accumulateAndGet(new BigDecimal(1.5).pow(finalI),
(bg1, bg2) -> bg1.add(bg2));
});
}
es.shutdown();
es.awaitTermination(10, TimeUnit.MINUTES);
System.out.println(sum.get().setScale(2, RoundingMode.CEILING));
}
}
}
1912864497.65 1912864497.65 1912864497.65 1912864497.65 1912864497.65
Example ProjectDependencies and Technologies Used:
|