线程的五种状态
新建:new
运行:runnable
等待:waitting(无限期等待),timed waitting(限期等待)
阻塞:blocked
结束:terminated
线程阻塞
在多线程情况下,如果一个线程对拥有某个资源的锁,那么这个线程就可以运行资源相关的代码。而其他线程就只能等待其执行完毕后,才能继续争夺资源锁,从而运行相关代码。
场景
车票售卖系统,当前剩余车票1张,此时有A、B、C、D四个用户同时来购票,系统开启了四个线程来执行业务操作
- A线程刚执行了step1;
- CPU将执行权切换到B线程,B线程顺利地执行了step1和step2,此时剩余票数为0;
- CPU将执行权又切换到A线程,A线程继续执行step2,此时票数为-1,多卖出一张票!出现异常业务数据。
这种情况就是多线程模式下的数据安全问题。
解决方案
在多线程的情况下,如果存在修改共享数据的操作,就要对操作步骤进行加锁,拥有锁的线程才可以执行相关代码。没有锁的线程只能等待其释放锁后,才有资格继续执行代码。