Volatile不保证原子性案例
1.什么叫做原子性
原子性就是一件事情不可分割,需要保证完整性。言外之意就是某个线程在完成某件任务,是不可被打断,加塞的,是不可分割的。要么同事成功,要么同时失败。
2.Volatile不保证原子性案例
package com.example.demo;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
-
Created by Administrator on 2020/6/18.
*/
class VDemo {
volatile int num;public void numUPlus() {
num++;
}
}
/**
-
Volatile不保证原子性案例
-
num默认为0 加Volatile的关键字
-
num++在多线程环境下是不保证线程安全的
*/
public class VolatileDemo {
public static void main(String[] args) {
VDemo vd = new VDemo();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j <2000 ; j++) {
vd.numUPlus();
}
}).start();
}//当上面计算完成之后,主线程得到num值进行输出,看结算结果为20000 while (Thread.activeCount()>2) { } System.out.println(Thread.currentThread().getName() + " end main number:" + vd.num);
}
}
3.如何解决Volatile不保证原子性问题
(1).加synchronized(不推荐)
(2).使用JUC下面的AtomicInteger
案例:
package com.example.demo;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
-
Created by Administrator on 2020/6/18.
*/
class VDemo {
volatile int num;public void numUPlus() {
num++;
}
AtomicInteger atomicInteger=new AtomicInteger();
public void addAtomic(){
atomicInteger.getAndIncrement();
}
}
/**
-
Volatile不保证原子性案例
-
num默认为0 加Volatile的关键字
*/
public class VolatileDemo {
public static void main(String[] args) {
VDemo vd = new VDemo();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j <2000 ; j++) {
vd.numUPlus();
vd.addAtomic();
}
}).start();
}//当上面计算完成之后,主线程得到num值进行输出,看结算结果为20000 while (Thread.activeCount()>2) { } System.out.println(Thread.currentThread().getName() + " end main number:" + vd.num); System.out.println(Thread.currentThread().getName() + " AtomicInteger main number:" + vd.atomicInteger);
}
}