【专业技术】如何搞定多线程?

存在问题:

多线程在我们开发中比较常见的方式,如何搞定多线程呢?

解决方案:

1,为什么需要多线程? 因为现代的CPU运行速度很快,哪怕是一个简单的嵌入式芯片也远远快于以前的电脑速度,如果系统在运行时只能干一件事情,实际上是很浪费,所以人们就想到把CPU的执行分成一个个小的时间片段,把不同片段分给不同的指令,由于划分的时间比较短,给人的感觉就是多个程序在同时执行,这样大大提高了CPU的使用效率。比如一台典型的web服务器,要是只能一个程序跑,那就只能一个人去访问了,其他人都等在后面。要是给每个人一个小的时间片段,那很多人都可以同时访问。这样大家的总体效率就提高了,也提高了CPU本身的利用率。

2,为什么需要同步? 同步是由于多线程的出现而出现的,单线程的程序是没有同步和互斥的概念的。由于处理器能同时处理多个任务,所以有时候会出现任务之间有先后顺序的问题,比如打字的程序,要是键盘没有输入,屏幕是不会显示输入字符的,也就是说显示这个任务和输入接收任务之间有先后顺序,需要输入字符后,才通知字符的显示,所以这两个线程就需要同步了,其实这样的例子太多了,再比如网络数据接收,服务器只有在接收到相应的数据之后才会做相应的处理也是这个道理。

3,为什么需要互斥? 互斥同样是由于多线程的出现才引入的,很多情况下,多个任务需要对同一个数据对象进行操作,典型的就是一个电脑上的文件,理论上所有程序都可以打开它来进行读和写,那要是刚好有一个正在写,一个正在读该怎么办?会不会出现问题?要是没有互斥,一定会出现问题的。这个时候互斥就派上用场了,我们从字面意思就知道互斥就是相互排斥,也就是说我在操作的时候其他人都不要动,要动也是等我操作完了你再去动,也就是说使用过程中觉有排他性,系统就出现这种排他性的机制就是互斥。

4,同步和互斥是否相同? 很多人把这两者搞混,其实同步和互斥是不同的,同步强调的是一种执行的依赖性,往往跟顺序有很强的关系,而互斥强调的是独占性。同步机制往往可以用来做互斥使用,但反过来互斥是不能做同步的。所以使用情况关键是看两个任务之间是什么关系?如果有先后依赖,则用同步;如果是独占和排他关系,则使用互斥。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端技术探索

vim神奇高效功能--批量生成Sql实例

可以通过写代码,读取文件进行入库,无论用什么语言,这代码逻辑都很容易实现。唯一的问题是代码需要上线后执行,每次上线可是一个大工程,恐怕会被pm同学嘲笑说:“你这...

1103
来自专栏Android群英传

Gradle函数复用的一点实践

1301
来自专栏唐郑望的专栏

Go 语言之三驾马车

Go 语言的三个核心设计: interface 、goroutine 、 channel。

1.8K0
来自专栏CSDN技术头条

史上最难的一道Java面试题:分析篇

无意中了解到如下题目,觉得蛮好。 题目如下: ? 该程序的输出结果? 在java中,多线程的程序最难理解、调试,很多时候执行结果并不像我们想象的那样执行。所以在...

2277
来自专栏数据结构笔记

实战:简书爬取之多线程爬取(二)速度提升何止10倍

其次就是这样的代码往往会有很严重的竞争问题,需要很多的资源锁来保证线程安全,这样就拉低了程序执行的速度。

1842
来自专栏数据库

Redis列表的“绝地反击”

大家晚上好,今天介绍Redis中的列表数据结构。 Redis中的列表是用来存储多个有序的字符串的,最神奇的地方是:竟然可以在列表两端插入(push)和弹出(po...

22910
来自专栏Python疯子

python爬虫保存到mongodb:bson.errors.InvalidDocument: key '18435-.net前端开发工程师(深圳)' must not contain '.'

bson.errors.InvalidDocument: key '18435-.net前端开发工程师(深圳)' must not contain '.'

4062
来自专栏jeremy的技术点滴

使用fail2ban进行DDOS防护

5095
来自专栏Vamei实验室

Python标准库11 多进程探索 (multiprocessing包)

在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。 进程池 进程池 (...

2125
来自专栏我是攻城师

关于Java中return和finally的执行顺序

在try或者catch语句里面,如果有return语句,那么finally会不会执行?

913

扫码关注云+社区

领取腾讯云代金券