查看连接池源码时看到了AtomicInteger,在多线程为了保存数据的一致性必须通过锁方式实现
AtomicInteger 主要通过 volatile 关键字在多线程中可以保证数据的原子性,但随之效率也会降低
测试用例,直接COPY运行
package com.hhly.sns.commons;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author wangyl-910
* @description 测试AtomicInteger多线程情况下数据是否异常
* @date 2017/8/19
* @see
*/
public class AtomicIntegerTest {
public static void main(String[] args) throws InterruptedException {
AtomicInteger atomicInteger = new AtomicInteger();
// 两个线程+2,两个线程 -1,结果 2000
for (int i = 0; i < 2; i++) {
IncrementThread incrementThread = new IncrementThread(atomicInteger);
incrementThread.start();
DecrementThread decrementThread = new DecrementThread(atomicInteger);
decrementThread.start();
}
Thread.sleep(1000);
// 结果等于2000
System.out.println(atomicInteger.get());
}
}
/**
* +2线程
*/
class IncrementThread extends Thread {
private AtomicInteger atomicInteger;
IncrementThread(AtomicInteger atomicInteger) {
this.atomicInteger = atomicInteger;
}
@Override
public void run() {
// 1000次
for (int i = 0; i < 1000; i++) {
atomicInteger.addAndGet(2);
}
}
}
/**
* -1线程
*/
class DecrementThread extends Thread {
private AtomicInteger atomicInteger;
DecrementThread(AtomicInteger atomicInteger) {
this.atomicInteger = atomicInteger;
}
@Override
public void run() {
// 1000次
for (int i = 0; i < 1000; i++) {
atomicInteger.getAndDecrement();
}
}
}