版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/82670096
多线程安全问题产生的原因
本文以一个简单的卖票程序为例开始讲解,上文就将该程序写出来了,程序代码如下:
class SaleTicket implements Runnable
{
private int tickets = 100;
public void run()
{
while (true)
{
if (tickets > 0)
{
try {Thread.sleep(10);} catch (InterruptedException e) {}//让线程到这里稍微停一下。
System.out.println(Thread.currentThread().getName() + "...." + tickets--);
}
}
}
}
class TicketDemo2
{
public static void main(String[] args)
{
//线程任务对象。
SaleTicket t = new SaleTicket();
//创建四个线程。通过Thread类的对象。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
通过运行该卖票程序可以发现有可能打印出0、-1、-2等错票,如下图所示:
这就表明多线程的运行出现了安全问题,产生的原因可归纳为两点:
- 线程任务中有处理到共享的数据;
- 线程任务中有多条对共享数据的操作。一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。
判断一个程序是否会有线程安全问题的标准?
- 是否是多线程环境;
- 是否有共享数据;
- 是否有多条语句操作共享数据。
如何解决多线程安全问题呢?
只要能保证多条操作共享数据的代码在某一时间段被一条线程所执行,在执行期间不允许其他线程参与运算。Java对于多线程的安全问题提供了专业的解决方式就是同步机制:同步代码块或者同步方法,把多个操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可。注意:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的。
至于解决多线程安全问题的具体实现方案,且看下文讲解!