原子操作类的多个方法调用并不构成原子性
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/10/09/16:07
* @Version
* @Description 原子操作类的多个方法调用并不构成原子性
*/
public class T4 {
static AtomicInteger count = new AtomicInteger(0);
void m (){
for (int i = 0; i < 10000; i++) {
synchronized (count){
if (count.get()<100&&count.get() >= 0){// 如果未加锁,之间还会有其他线程插进来
count.incrementAndGet();
}}
}
}
public static void test(String[] args) {
T4 t = new T4();
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10; i++) {
threads.add(new Thread(t::m,"thread-"+i));
}
threads.forEach(Thread::start);
threads.forEach((o)->{
try {
o.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
System.out.println(t.count);
}
public static void main(String[] args) {
T4 t = new T4();
for (int i = 0; i < 10; i++) {
new Thread(t::ms,"T"+i).start();
}
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(count.get());
}
void ms(){
for (int i = 0; i < 10000; i++) {
synchronized (this){
if (count.get()<100&&count.get()>=0){// 未加锁,其他线程可能会进来
count.incrementAndGet();
}
}
}
}
}
得出结论
AtomisXxx类/原子操作类没有原子性
所以需要添加锁