Java学习线程安全概念

文章资讯 2020-06-14 16:48:46

Java学习线程安全概念

线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。即——当多个线程访问某一个类(对象)时,这个类始终都能表现出正确的行为。
卖票案例模拟线程安全问题
【案例描述】电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是“战狼3”,本次电影的座位共100个(本场电影只能卖100张票)。我们来模拟电影院的售票窗口,实现多个窗口同时卖“葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这100张票)需要窗口,采用线程对象来模拟;需要票,Runnable接口子类来模拟。
程序演示:
ubcclassRunnableImlimlementsRunnable{定义一个多线程共享的票源
rivateintticket=100;设置线程任务:卖票
@Override
ubcvoidrun(){
while(true){
先判断票是否存在
if(ticket>0){
票存在,卖票ticket--
提高安全问题出现的概率,让程序睡眠
try{
Tead.slee(100);
}catch(InterrutedExcetione){
e.rintStackTrace();
}
System.out.rintln(Tead.curntTead().getName()+"-->正在,卖第"+ticket+"张票");
ticket--;
}
}
}
}*
模拟卖票案例
创建3个线程,同时开启,对共享的票进行出售
*
ubcclassDemo01Ticket{ubcstaticvoidmain(String[]args){
创建Runnable接口的实现类对象
Runnablerun=newRunnableIml();多态
创建Tead类对象,构造方法中传递Runnable接口的实现类对象
Teadt0=newTead(run);
Teadt1=newTead(run);
Teadt2=newTead(run);调用start方法开启多线程
t0.start();
t1.start();
t2.start();
}
}
我们可以发现程序出现了两个问题:相同的票数,比如第7张票被卖了两回。
不存在的票,比如0票与-1票,是不存在的。这种问题,几个窗口(线程)票数不同步了,称为线程不安全。线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。