package Wxin1997;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Atomxxx类的多个方法并不构成原子性
*/
public class Ex5 {
AtomicInteger count=new AtomicInteger(0);
void m(){
for (int i = 0; i < 1000; i++) {
if(count.get()<100&&count.get()>=0){
//如果为加锁,之间还会有其他线程插进来
count.incrementAndGet();
}
}
}
public static void main(String[] args) {
Ex5 t=new Ex5();
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{
//join()方法阻塞调用此方法的线程,知道线程t完成,此线程再继续通常用于再main()主线程内,等待其他线程完成再结束main()主线程
o.join();//相当于在main线程中同步o线程,o执行完了,main线程才会执行
}catch (Exception e){
e.printStackTrace();
}
});
System.out.println(t.count);
}
package Wxin1997;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 证明Atomxxx类的多个方法并不构成原子性
*/
public class Ex6 {
AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) {
var t=new Ex6();
for (int i = 0; i < 1000; i++) {
new Thread(t::m,"T"+i).start();
}
try{
TimeUnit.SECONDS.sleep(2);
System.out.println(t.count.get());
}catch (Exception e){
e.printStackTrace();
}
}
void m(){
for (int i = 0; i < 1000; i++) {
synchronized (this){
if(count.get()<100&&count.get()>=0){
//如果为加锁,之间还会有其他线程插进来
count.incrementAndGet();
}
}
}
}
}