当多个线程要访问同一个数据时,包括取值、询问、修改时,必然会出现多线程并发安全问题
public class MyObject{
int i = 0;
public synchronized void increment(){
//同一时间,只有一个线程可以进入当前方法
//在一个对象实例的方法上加synchronized
i++;
}
}
调用:
MyObject mo = new MyObject();
mo.increment();
这种加锁的方式是串行化,执行效率不高。多线程情况下,需要排队执行increment方法
使用并发包下的AtomicInteger类(底层基于CAS来进行实现)
public class MyObject{
AtomicInteger i = new AtomicInteger(0);
public void increment(){
//多个线程此时来执行这段代码
//不需要synchronized加锁,也是线程安全的
i.incrementAndGet();
}
}
CAS全称 compare and set,CAS操作是原子的,底层会进行硬件之别的上锁,中间是不可以被打断的
(1)先读取当前值,假设i&