Java 并发编程(一):摩拳擦掌
发布日期:2021-04-30 21:09:26 浏览次数:120 分类:精选文章

本文共 1288 字,大约阅读时间需要 4 分钟。

01、为什么需要操作系统

我喜欢用电脑写文章,但如果电脑只能同时做一件事,就相当于写完文章后又得等很久才能听音乐,这很不方便。在没有操作系统的情况下,这样的体验确实很常见。

有了操作系统后,电脑就可以同时运行多个程序。通过查看进程列表(比如使用TOP命令),我们可以看到电脑正在运行的程序和进程。例如,"Google Chrome"会有三个进程,这说明我正在运行着一个名为谷歌浏览器的程序。

程序和进程的关系可以简单地说:程序是完成特定任务的指令序列,操作系统允许多个程序同时运行,并为每个程序创建进程来分配资源和调度执行。如果一个程序被多次执行,操作系统会为每次执行创建一个新的进程。同一个进程中的线程会共享内存空间,但如果没有同步机制,线程之间可能会访问相同的变量,导致不可预测的结果。

02、多线程的优势

我的电脑只有一个物理CPU,但核数是4个。这意味着我这台电脑可以在同一时间处理一个进程中的四个线程。例如,线程A在读取文件,线程B在写入文件,线程C在计算数值,线程D在进行网络传输。

文件读写或网络传输常常会发生阻塞,这是无法避免的。如果没有多线程,程序只能按顺序执行,阻塞任务就会等待。多线程则可以让线程之间互不干扰,充分发挥多核CPU的优势。

比如,我用Eclipse写代码时,如果一个进度卡住,其他任务就得等它完成才能继续,这非常不方便。多线程可以让每个任务单独执行,响应会更快。

03、多线程带来的风险

多线程的优势显而易见,但也伴随着风险。最常见的问题是线程安全。例如,以下代码在单线程环境下可以正常工作,但在多线程环境下可能会返回相同结果:

public class Unsafe { private int chenmo; public int add() { return chenmo++; } }

递增运算chenmo++可以分解为读取、加1和赋值三个操作。如果两个线程交替执行,可能会导致读取到相同的值。

此外,多线程还会引发活跃性问题。如果线程B需要等待线程A释放资源,而线程A无法释放,线程B就只能等待。这种情况会导致资源被占用,效率降低。

多线程还可能带来性能问题。线程调度器切换上下文时会消耗资源,频繁切换会增加开销。

04、单核CPU和多核CPU

假设CPU只有一个核,多线程还有优势吗?闭上眼想一想。

在单核CPU上,多线程程序会轮流执行,每个线程都有自己的时间片(大约10ms)。虽然看起来像是同时运行,但实际上线程切换会增加系统开销,效率不会有明显提升。

多核CPU则完全不同。多核需要多线程来发挥优势。多线程可以同时处理不同任务,减少阻塞时间。对于IO密集型任务,多线程可以让CPU等待I/O时不浪费资源。对于计算密集型任务,多线程可以让每个核心都忙碌。

多核CPU不仅适合处理多任务,还能更好地处理计算密集型任务。例如,加密、解密和数据压缩解压都可以分配给不同的核心,让每个核心都有忙碌。

05、最后

这篇文章就到此结束。希望你喜欢这篇内容,期待下一篇的到来。记得关注公众号,回复"2048"免费获取程序员进阶必读资料包!

上一篇:Mybatis-Plus最优雅的使用
下一篇:初中级程序员进阶高级程序员,必须要了解的设计模式(45种设计模式)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2026年05月28日 03时48分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章