使用场景:
当我们在进行多线程操作共享数据的时候,如果我们不进行锁的处理,我们就会发现会有重复执行的现象,例如卖票操作,票如果是共享数据的话,那就会出现100张票卖了100多人的现象(其实就是线程安全问题)
解决方案:
方案一:一般我们都会进行加锁进行解决,将操作共享数据的地方用synchronized ()包裹起来
方案二:利用Lock锁进行加锁
方案三:volatile关键字也可以保证原子的可见性,来达到共享数据的安全性
方案四:就是我们今天介绍的方法,AtomicInteger也可以进行对于共享数据操作时保证原子性,从而解决线程的安全问题
基本使用:
public class MyAtomIntegerDemo1 {
//public AtomicInteger(int initialValue): 初始化一个指定值的原子型Integer
//int addAndGet(int data): 以原子方式将参数与对象中的值相加,并返回结果。
public static void main(String[] args) {
AtomicInteger ac = new AtomicInteger(10); // Integer i = 10;
System.out.println(ac.get());
int i = ac.addAndGet(20); // 10 + 20
System.out.println(i);
System.out.println(ac.get());
}
}
在多线程的情况下如何使用demo
public class MyAtomThread implements Runnable {
//private int count = 0; //送冰淇淋的数量
private AtomicInteger count = new AtomicInteger(0);
@Override
public void run() {
for (int i = 0; i < 100; i++) {
count.addAndGet(1);
System.out.println("已经送了" + count.get() + "个汉堡");
}
}
}
public class AtomDemo {
public static void main(String[] args) {
MyAtomThread atom = new MyAtomThread();
for (int i = 0; i < 100; i++) {
new Thread(atom).start();
}
}
}
发现没有并没有重复的数据!安全问题解决!