什么是线程安全问题
当多个线程共享同一个全局变量,做写的时候,可能会受到其他线程的干扰,导致数据误差,这种现象叫做线程安全问题。
线程安全问题解决思路:多个线程不要同时操作同一个全局变量做写的操作
举例:现在有50张火车票,有两个窗口同时抢火车票,多线程模拟卖票
package com.cvicse.thread.demo2;
//线程安全问题 模拟火车站窗口卖票
/**
* 现在有50张火车票,有两个窗口同时抢火车票,多线程模拟
* @author 15169
*
*/
class ThreadTrain implements Runnable{
/**
* 什么是线程安全问题
* 当多个线程共享同一个全局变量,做写的时候,可能会受到其他线程的干扰,导致数据误差,这种现象叫做线程安全问题。
*/
//火车票50张
private static int ticket = 50 ;
@Override
public void run() {
/**
* 模拟程序一直抢票
*/
/*
* synchronized (this) { //同步代码块,锁定的是当前线程对象 //出售火车票 while(ticket>0) { try {
* Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
* System.out.println(Thread.currentThread().getName()+"出售第 "+(50-ticket+1)
* +" 张票"); ticket--; } }
*/
sale();
}
//同步方法
public synchronized void sale() {
while(ticket>0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"出售第 "+(50-ticket+1)+" 张票");
ticket--;
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
ThreadTrain threadTrain = new ThreadTrain();
Thread t1 = new Thread(threadTrain,"窗口 ①");
Thread t2 = new Thread(threadTrain,"窗口 ②");
t1.start();
t2.start();
}
}