数据不一致问题引入
在串行化的程序中,不存在资源共享,也就不存在线程安全的问题。但由于CPU核数的增加,依旧使用串行化的任务执行大大浪费了CPU的计算能力。在企业系统中,为了追求更高的系统吞吐量,采用并行化的任务执行,充分利用CPU的资源。但是并发或并行的程序也带来了共享资源的安全隐患。其中常见的安全问题之一便是数据不一致问题。
数据不一致问题案例:
public class Test {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(()->{
for (int i = 0; i < 600; i++) {
ticket.sale();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 600; i++) {
ticket.sale();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 600; i++) {
ticket.sale();
}
},"C").start();
new Thread(()->{
for (int i = 0; i < 600; i++) {
ticket.sale();
}
},"D").start();
}
}
//资源类 OOP
class Ticket{
private int number = 600;
// 卖票
public void sale(){
if(number > 0){
System.out.println("当前线程为:" + Thread.currentThread().getName() + " 卖出了一张票,当前票数为:" + number--);
}
}