本文参考《java并发编程实战》,java并发必读书籍
一、线程的优势
1.发挥多处理器的强大能力
一个线程对应一个处理器
2.建模的简单性
通过使用线程,可以将复杂并且异步的工作流进一步分解为一组简单并且同步的工作流;
每个工作流在一个单独的线程中运行
并在特定的同步位置进行交互
3.异步事件的简化处理
在服务器应用程序在接受多个远程客户端的套接字连接请求时:为每个连接都分配独立的线程并且使用同步I/O
降低了开发难度
4.响应更灵敏的用户界面
传统的GUI应用程序:主事件循环
现代的GUI框架:事件分发线程
二、线程带来的风险
1.安全性问题(目标:永远不发生糟糕的事情)
存在竞态条件(Race Condition)时,会产生安全性问题
例如
private int value;
public int getNext() {
return value++;
}
value++
等价于
temp = value;
value = value + 1;
value = temp;
2.活跃性问题(目标:正确的事情最终会发生)
担心的是:死锁、饥饿、活锁(这些不懂得可以关注后续文章)
3.性能问题(目标:正确的事情尽快发生)
线程带来开销
上下文切换操作开销:保存和恢复执行上下文,丢失局部性,CPU时间更多的花在线程调度而不是线程运行上
抑制编译器优化(比如重排序)