最近在学并发编程时,老师提了这样一个问题:既然在学多线程时,多个线程之间并发运行,这会导致线程安全问题,不如两个线程同时修改同一个变量,那么我用一个核,也就是说在一个时间内,只运行一个线程,这种情况下会有线程安全问题吗?
到底什么是多线程?
其实多线程并不是简单的多个核心同时运行多个线程,事实上,单个线程也是可以运行多个线程的,通过分时来实现,同一时间内还是运行一个线程,毕竟只有一个核心,但通过分时就能实现两个线程同时进行。
线程安全问题的本质
在并发编程中,线程安全问题的本质其实就是 原子性、有序性、可见性;接下来主要围绕这三个问题进行展开分析其本质,彻底了解可见性的特性
-
原子性 和数据库事务中的原子性一样,满足原子性特性的操作是不可中断的,要么全部执行成功要么全部执行失败
-
有序性 编译器和处理器为了优化程序性能而对指令序列进行重排序,也就是你编写的代码顺序和最终执行的指令顺序是不一致的,重排序可能会导致多线程程序出现内存可见性问题
-
可见性 多个线程访问同一个共享变量时,其中一个线程对这个共享变量值的修改,其他线程能够立刻获得修改以后的值
单核情况下会有线程安全问题吗?
答案是会的
因为单核cpu仍然存在线程切换,在执行非原子操作的时候,仍然存在线程问题。
主要的线程安全问题包括:
- 竞态条件:如果两个或多个线程试图同时修改相同的共享数据,并且这些修改的顺序影响最终结果,就会发生竞态条件。
- 死锁:当两个或多个线程互相等待对方释放资源时,会发生死锁,即每个线程都无法继续执行。
- 活锁:线程虽然没有处于等待状态,但因为持续尝试并失败而无法继续执行工作。
- 资源饥饿:某个线程长时间无法获得所需的资源,导致无法继续执行。
即使在单核处理器上,这些问题也可能发生,因为操作系统的线程调度机制会使得线程在执行时被中断并切换到其他线程。因此,为了确保线程安全,仍然需要使用适当的同步机制,如互斥锁、信号量等,来保护共享数据。