一直以来Java都有些晦涩难懂,都有哪些呢?类的继承关系、泛型的应用、JVM等,当然也有多线程,也许说没有并发的程序毫无意义或没劲,很片面......但是多线程应用下的各种并发问题,是很让人头疼的事。这里简单的总结一些多线程的特点和问题,后续会有更深入的理解和总结。引用一句经典“编写正确的程序很难,而编写正确的并发程序则难上加难”,难在哪里呢?
一、并发发展史
早期在没有操作系统的时代,计算机只能执行一个程序,这是对稀缺的计算机资源的浪费,直至操作系统的出现,计算机可以运行多个程序,操作系统会为每个程序(进程)分配运行时资源(内存、文件句柄、安全证书),同时进程间可以通过通信机制交换数据。这提高了计算机的资源利用率,提升了用户和程序运行的公平性,当然也有便利性。
二、多线程的优势
- 降低程序的并发和维护成本,提升复杂应用程序的性能(线程可以将异步工作流转换为串行工作流,模拟人可以在某一时间段同时完成多个任务).
- 降低代码复杂度,使代码更容易编写、阅读、维护。
三、线程的矛盾
- 安全性:共享数据,当多个线程同时访问共享数据,线程的时序问题,可能导致错误的结果。
- 活跃性:共享数据,当多个线程同时请求访问共享数据时,会面临“当某个操作无法继续执行下去”的活跃问题,如多个线程请求访问资源排队问题,如果某个线程一直占用资源不释放,其他线程将陷入请求等待的死循环中,死锁、饥饿、活锁。
- 性能:服务时间过长、响应不灵敏、吞吐率过低、资源消耗过高、可伸缩性低。