概念:进程、线程、多线程、线程调度

进程

进程是操作系统管理的一个独立单位,它代表一个正在执行的程序的实例。进程拥有独立的内存空间以及其他运行时资源。每个进程至少有一个线程(主线程),但可以包含多个线程。

线程

线程是进程中的一个执行流。相比进程,线程共享属于相同进程的内存和资源,包括文件句柄和其他系统资源。线程是操作系统调度的基本单位,拥有自己的执行堆栈、程序计数器和一组寄存器。

多线程

多线程是指在单个进程中运行多个线程,它们可以共享相同的内存空间和资源,而不需要在操作系统层面进行进程间通信(IPC)。使用多线程可以使一个程序同时执行多项任务,提高资源使用率和程序响应速度。

多线程并发

多线程并发是指多个线程在同一时刻被操作系统调度,以便在单个核心上交替执行(真正并发只有在多核处理器上才能实现)。并发执行能够使得多个任务逻辑上是同时进行的,即使在单核CPU上,多个线程也会因为时间片轮转(time-slicing)而看起来像是同时进行的。

并发不是并行:

  • 并发(Concurrency):同一时间管理多个任务的能力(交替执行)。
  • 并行(Parallelism):同一时间执行多个任务的能力(真正的同时执行)。

线程调度

线程调度是一个让多个线程有序运行的过程,线程调度由操作系统内的调度器(scheduler)来负责。线程调度通常遵循特定的策略:

  • 时间片轮转调度(Round-Robin Scheduling):每个线程被分配一定的时间片来运行。当一个线程的时间片用完,调度器会使其挂起,并给予下一个线程时间片执行的机会。
  • 优先级调度:每个线程会根据特定的规则(如任务的紧迫性、重要性等)被分配一个优先级。通常,高优先级的线程会先于低优先级的线程得到执行。
  • 公平调度:尽力确保每个线程都能获得公平的执行机会。
  • 抢占式调度:一个更高优先级的线程可以“抢占”当前低优先级线程的执行,立刻获得CPU的控制权。

在多核处理器上,线程还可能在不同的核或处理器之间迁移,这种情况下的调度称为处理器亲和性(processor affinity)调度。

线程同步

由于线程可能会共享数据和资源,所以为了避免冲突,需要通过线程同步机制来保证数据的一致性和完整性。常见的线程同步机制包括锁(如互斥量mutexes)、信号量(semaphores)、条件变量(condition variables)和屏障(barriers)等。

synchronized:是 Java 中的关键字,用于实现同步访问共享资源。当一个线程获得了对象的锁(也称为监视器锁)时,其他试图获取该锁的线程将被阻塞,直到该线程释放锁为止。synchronized 可以用于修饰方法或代码块,以确保在同一时刻只有一个线程能够执行被修饰的代码区域,从而保证了线程的安全性。

ReentrantLock:是 Java 中的一个类,用于实现显示锁(也称为互斥锁)。与 synchronized 相比,ReentrantLock 提供了更灵活的锁定机制,可以实现可重入、定时、可中断、公平和非公平等特性。使用 ReentrantLock 可以更精确地控制锁的获取和释放,并且提供了更多的扩展功能。

Volatile:是 Java 中的关键字,用于修饰变量,用于确保变量的可见性。当一个变量被 volatile 修饰时,对该变量的写操作会立即被其他线程可见,保证了多个线程之间对该变量的可见性。Volatile 关键字通常用于标记一些状态标志位或者计数器等,它的作用是告诉编译器不要对这个变量进行缓存优化,每次都直接从主存中读取该变量的值。

这些机制和关键字的存在是为了确保多线程并发执行时的正确性和稳定性。由于多线程环境下的竞态条件、内存可见性问题和线程安全性问题会导致程序的不确定性和错误,因此需要通过这些机制来保证多线程程序的正确性。不同的场景和需求可能会选择不同的机制来解决并发问题,以满足程序的性能和可维护性要求。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值