原子性
概念;
一批操作(线程)是一个整体,要么成功要么死亡.
维持原子性解决方案一
加锁
给线程共享资源加锁,不仅解决了线程安全问题,还维持了原子性.
但是性能慢
维持原子性解决方案二
使用基于CAS原子类
概述:java从JDK1.5开始提供了java.util.concurrent.atomic包(简称Atomic包),
这个包中的原子操作类提供了一种用法简单,性能高效,线程安全地更新一个变量的方式。
-- 操作整型的原子类
public AtomicInteger(): 初始化一个默认值为0的原子型Integer
public AtomicInteger(int initialValue): 初始化一个指定值的原子型Integer
int get(): 获取值
int getAndIncrement(): 以原子方式将当前值加1,注意,这里返回的是自增前的值。
int incrementAndGet(): 以原子方式将当前值加1,注意,这里返回的是自增后的值。
int addAndGet(int data): 以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果。
int getAndSet(int value): 以原子方式设置为newValue的值,并返回旧值。
代码演示
public class VolatileAtomicThread {
public static void main(String[] args) {
// 100个线程启动
Runnable target = new MyRunnable();
for(int i = 1 ; i <= 100 ; i++ ){
new Thread(target).start();
}
}
}
class MyRunnable implements Runnable{
private AtomicInteger atomicInteger = new AtomicInteger(); // 整数对象!!
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("count =========>>>> " + atomicInteger.incrementAndGet()); // 先增再取!//10000
}
}
}