什么是线程安全问题?
当多线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据数据冲突问题。但是做读的操作时是不会发生数据冲突问题
需求如下:100张车票 ,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。
package com.zuojie;
/**
* @author:zuojie
*/
public class ThreadTrain implements Runnable{
//火车票总数
private int count=100;
@Override
public void run() {
while(count>0){
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",出售第"+(100-count+1)+"张票");
count--;
}
}
}
package com.zuojie;
/**
* 什么是线程不安全
* 当多个线程同时操作一个共享的全局变量,全局变量可能受到其他线程的干扰
* 功能描述:(模拟线程不安全问题)
* @author:zuojie
*/
public class ThreadDemo {
public static void main(String [] args){
//线程类一定要是一个实例
ThreadTrain threadTrain=new ThreadTrain();
//1.创建两个线程
Thread t1=new Thread(threadTrain);
Thread t2=new Thread(threadTrain);
t1.start();
t2.start();
}
}
结果如下:出现了101张票这就是线程安全问题。
那么线程安全问题怎么解决?可以使用synchronized jdk1.5并发包lock
代码修改如下:
package com.zuojie;
/**
* @author:zuojie
*/
public class ThreadTrain implements Runnable{
//火车票总数
private int count=100;
private Object object=new Object();
@Override
public void run() {
while(count>0){
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object){
if(count>0) {
System.out.println(Thread.currentThread().getName() + ",出售第" + (100 - count + 1) + "张票");
count--;
}
}
}
}
}
package com.zuojie;
/**
* 什么是线程不安全
* 当多个线程同时操作一个共享的全局变量,全局变量可能受到其他线程的干扰
* 功能描述:(模拟线程不安全问题)
* @author:zuojie
*/
public class ThreadDemo {
public static void main(String [] args){
//线程类一定要是一个实例
ThreadTrain threadTrain=new ThreadTrain();
//1.创建两个线程
Thread t1=new Thread(threadTrain);
Thread t2=new Thread(threadTrain);
t1.start();
t2.start();
}
}