public classAtomicityTest {privateCounter counter;/*** 每个线程打印的次数*/
private intcount;
@Beforepublic voidinit(){
counter= newCounter();
count= 10000;
}/*** 非线程安全的i++*/@Testpublic void increment() throwsInterruptedException {
Thread t1= new Thread(() ->{for (int i = 0; i < count; i++) {
counter.increment();
}
});
Thread t2= new Thread(() ->{for (int i = 0; i < count; i++) {
counter.increment();
}
});
t1.start();
t2.start();//单元测试必须新起的线程要在主线程里join,否则主线程运行完毕,新起的线程还执行完
t1.join();
t2.join();/*ThreeParamsEquals equals = (Enum p1, Enum p2, Enum p3) -> p1.equals(p2) && p1.equals(p3);
while (true){
if (equals.equals(Thread.State.TERMINATED, t1.getState(), t2.getState())) {
break;
}
}*/System.out.println(t1.getState());
System.out.println(t2.getState());//由于不是原子性操作,两个线程执行总共20000次i++,结果i的值都小于20000
System.out.println(counter.getI());
}/*** 线程安全的i++*/@Testpublic void incrementSync() throwsInterruptedException {
Thread t1= new Thread(() ->{for (int i = 0; i < count; i++) {
counter.incrementSync();
}
});
Thread t2= new Thread(() ->{for (int i = 0; i < count; i++) {
counter.incrementSync();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(t1.getState());
System.out.println(t2.getState());//由于保证了原子性,顺序性,可见性操作,两个线程执行总共20000次i++,结果i的值都等于20000
System.out.println(counter.getI());
}/*** 原子类AtomicInteger*/@Testpublic void incrementAtomic() throwsInterruptedException {
Thread t1= new Thread(() ->{for (int i = 0; i < count; i++) {
counter.incrementAtomic();
}
});
Thread t2= new Thread(() ->{for (int i = 0; i < count; i++) {
counter.incrementAtomic();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(t1.getState());
System.out.println(t2.getState());//由于保证了原子性,顺序性,可见性操作,两个线程执行总共20000次i++,结果i的值都等于20000
System.out.println(counter.getAtomicInteger());
}
}