原子类保证多线程环境下的数据安全的示例
原子类保证多线程环境下的数据安全的示例
1、原子整型类保证多线程环境下的数据安全示例:
package com.joyupx.cms.example.thread.concurrent.atomic; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.atomic.AtomicInteger; /** * 原子性操作 * 多线程环境下保障数据安全。 */ @Slf4j public class AtomicIntegerIncrementExample { private static AtomicInteger num = new AtomicInteger(0); public static void main(String[] args) { Thread incrementThreadA = new Increment(); Thread incrementThreadB = new Increment(); incrementThreadA.start(); incrementThreadB.start(); try { incrementThreadA.join(); incrementThreadB.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } // 值只要小于 20000 = 2 * 1000 就表示是非原子操作。 log.info("num = {}", num); } static class Increment extends Thread { @Override public void run() { log.info("{} 自增前 num = {}", Thread.currentThread().getName(), num); /* * 数量太少了看不出来,所以这里给了 10000 次递增。 * 具体次数取决于具体的硬件,比如 CPU、内存、线程数等,请酌情考虑。 */ for (int index = 0; index < 10000; ++index) { num.incrementAndGet(); } log.info("{} 自增后 num = {}", Thread.currentThread().getName(), num.get()); } } }
2、原子长整型类保证多线程环境下的数据安全示例:
package com.joyupx.cms.example.thread.concurrent.atomic;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.atomic.AtomicLong;
/**
* 原子性操作
* 多线程环境下保障数据安全。
*/
@Slf4j
public class AtomicLongIncrementExample {
private static AtomicLong num = new AtomicLong(0);
public static void main(String[] args) {
Thread incrementThreadA = new Increment();
Thread incrementThreadB = new Increment();
incrementThreadA.start();
incrementThreadB.start();
try {
incrementThreadA.join();
incrementThreadB.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 值只要小于 20000 = 2 * 1000 就表示是非原子操作。
log.info("num = {}", num);
}
static class Increment extends Thread {
@Override
public void run() {
log.info("{} 自增前 num = {}", Thread.currentThread().getName(), num);
/*
* 数量太少了看不出来,所以这里给了 10000 次递增。
* 具体次数取决于具体的硬件,比如 CPU、内存、线程数等,请酌情考虑。
*/
for (int index = 0; index < 10000; ++index) {
num.incrementAndGet();
}
log.info("{} 自增后 num = {}", Thread.currentThread().getName(), num.get());
}
}
}