前言
多个线程操作共享资源的时候,会导致共享资源出现错乱。线程安全问题都是由全局变量及静态变量引起的。只要是涉及到多个线程操作同一份数据,我们就必须去考虑线程的安全问题。
一、线程安全是什么?
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
二、案例
1.出现线程安全案例
我们通过电影院买票案例来说明线程安全问题
电影院想要通过三个窗口卖出一共100张票,采用多线程实现。package com.ming.quiz;
public class SellTickets {
public static void main(String[] args) {
//创建卖一共100张票的线程任务
SellTicketsRunnable ticketsRunnable = new SellTicketsRunnable();
//共100张票,创建窗口一卖票
Thread thread1 = new Thread(ticketsRunnable, "窗口一");
//共100张票,创建窗口二卖票
Thread thread2 = new Thread(ticketsRunnable, "窗口二");
//共100张票,创建窗口三卖票
Thread thread3 = new Thread(ticketsRunnable, "窗口三");
thread1.start();
thread2.start();
thread3.start();
}
}
class SellTicketsRunnable implements Runnable {
int ticks = 100;
//实现窗口卖票的逻辑
@Override
public void run() {
String name = Thread.currentThread().getName();
while (true) {
if (ticks > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticks--;
System.out.println(name + "卖出了一张票,剩余:" + ticks);
} else {
System.out.println("票卖光了!");
break;
}
}
}
}
2.结果分析
从结果上可以看到,出现了多个窗口同一张票的情况,还有票号为-1的情况。这些在实际情况中,都是不符合预期的。
总结
a.线程安全问题是指当有多个线程操作共享资源时,导致共享资源出现错乱;
b.出现线程安全问题的条件:使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题