在单线程中,每次只做一件事情,但是如果使用多线程,就会发生两个线程抢占资源的问题,比如两个人过独木桥,两个人同时说话,所以要在线程编程中避免这些资源访问的冲突。Java 提供了线程同步的机制来防止资源访问的冲突。
一、线程安全
在实际开发中,使用多线程的情况很多,如网上购票系统,银行排号系统。以火车站售票系统为例,在代码中判断票数是否大于0,如果大于 0 则执行售票功能,但是当多个线程同时访问这个代码时(假如就剩一张票),第一个线程将票售出,此时票数已经没有了,但是后面的线程也在执行此操作,所以票数会出现负数的情况,这样的线程是不安全的,所以在编写程序的时候,应该考虑到线程安全问题。
实际上线程安全问题来源于多个线程操作同时存取单一对象的数据。
下面用代码来模拟火车站的网上售票系统的功能,代码如下:
public class BuyTicket implements Runnable {
boolean flag = true;
//定义了10张票
int tickNum = 10;
@Override
public void run() {
//调用买票的方法
while (flag) {
ticket();
}
}
public void ticket() {
//如果票数小于0就结束抢票
if (tickNum <= 0) {
flag = false;
return;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread()