本文共 704 字,大约阅读时间需要 2 分钟。
在大多数现代操作系统中,都是以线程为基本的调度单位。如果没有明确的协同机制,那么线程将彼此独立执行。由于同一个进程中的所有线程都将共享进程的内存地址空间,因此这些线程都能访问相同的变量并在同一个堆上分配对象。但每个线程都有各自的程序计数器,栈以及局部变量等。
通过提高时钟频率来提升性能已经变得越来越困难,处理器产商都开始转而在单个芯片上防止多个处理器核。由于基本的调度单位是线程,因此如果程序中只有一个线程,那么最多同时只能在一个处理器上运行,单线程程序无疑是对多处理器系统的资源浪费。即便是单处理器系统,使用多个线程也有助于获得更高的吞吐率,使程序能够在I/O阻塞期间继续执行。
多线程的另一个优势在于建模的简单性。单一类型的任务更易于编写和调试,将复杂且异步的工作流分解为一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置进行交互。
线程安全性是非常复杂的,在没有充足同步的情况下,多个线程的操作执行顺序是不可预测的。多线程共享内存空间比其他线程间通信机制更容易实现数据共享,但必须对共享变量的操作进行协同。例如,java的synchronized关键字,具体用法详见:。在《Java并发编程实战》这本书中,作者提出了线程安全性的定义,线程安全性最核心的概念就是正确性,即类的行为和规范是一致的。当多个线程访问某个类时,不论采用何种调度方式,并且无需任何额外的同步或协同,这个类都能保证正确的行为,那么就这个类是线程安全的。线程安全类封装了必要的同步机制。
当正确性依赖多线程的时序时,就会发生竞态条件。一种常见类型是先检测后执行,即通过一个失效的观测结果决定下一步的动作。
转载地址:http://jgcws.baihongyu.com/