引言
- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前面都说了程序是如何运行的,那有开始就有结束,今天来聊聊程序是如何挂的?我们说了cpu是在我们的线程高速切换的,从逻辑上看是同时运行的,每个线程都会创建自己的线程栈,线程栈是彼此隔离的,也就是说线程里的数据并不是每个线程共享的。
线程安全
虽然线程栈不是共享的,但是堆是共享的啊,堆可以被所有线程读写,那如果多个线程对同一个变量写入数据,就会引发常见的线程安全问题。
解决线程安全的手段就是加锁,如果线程执行到一段代码,但是还没有获得锁,为了保证线程安全,就不能让这个线程执行这段代码,而是先让线程去获取锁,如果获取不到锁就等待。
程序卡顿
线程获取不到锁就只能等待其它线程释放锁,但线程是承载了用户的任务的,如果这个线程无法返回,程序就要等着,程序无法继续执行,程序就无法给客户响应,那客户就会觉得这个程序卡了。
比如我们的I/o操作和获取数据库连接的操作都会引起线程阻塞,因为数据库的连接是有限的,如果线程过多,其它线程就得等着,但是线程等着归等着,占用的系统资源可释放不了,那当越来越多的线程阻塞,占用足够多的系统资源时,程序就挂了。
解决方式
导致程序挂的原因主要是系统并发数太多,那我们可以使用分布式架构,使用多台服务器搭建集群的方式来缓冲流量峰值,必要时也可限流,减少请求,也可做服务降级减少线程的资源损耗。