售票系统:
在代码中判断当前票数是否大于0,如果大于0,那么执行将门票出售给客人的工作;
当只剩一张票时,第一个线程将票售出,与此同时,第二个线程已经执行完成判断是否有票的操作,并的出票大于零的结论。于是,它也将票出售,这样就会产生负数。
在编写多线程程序中,应该考虑到线程安全问题,线程安全来自于两个线程同时存取单一对象的数据。
package com.company;
import java.lang.Runnable;
/**
* 线程同步机制---线程安全问题
* 在项目中创建ThreadSafeTest类,该类实现了Runnable接口,模拟火车站售票系统的功能
*
* 并发编程,需要考虑系统的安全问题,线程安全问题来自于两个线程同时存取单一对象的数据
*
* 多线程编程,首先要考虑线程安全问题,理解线程同步机制
*/
public class ThreadSafeTest implements Runnable {
int num = 10; // 设置当前总票数
public void run() {
while (true) {
if (num > 0) {
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("tickets" + num--);
}
}
}
public static void main(String[] args) {
ThreadSafeTest t = new ThreadSafeTest(); // 实例化类对象
Thread tA = new Thread(t); // 以该类对象分别实例化4个线程
Thread tB = new Thread(t);
Thread tC = new Thread(t);
Thread tD = new Thread(t);
tA.start(); // 分别启动线程
tB.start();
tC.start();
tD.start();
}
}
结果
tickets10
tickets7
tickets8
tickets9
tickets5
tickets3
tickets6
tickets4
tickets1
tickets-1
tickets0
tickets2
十分的不安全,这种抢票系统设计的没有安全度