如果一段代码被锁住执行完再去执行另一段代码,这和顺序执行有什么区别呢,求各位大神解答啊
看得出来,楼主对于并发和多线程的一些概念理解上和大家有些出入,而且缺乏实际的经验。
这里打个比方,借用超市运货来说明:
有一家超市要把货搬到仓库里,可以选择一个人来搬货(**单线程**)或者多叫几个人来搬货(**多线程**)。很显然在这里并发提升了效率。
继续深入这个场景,假设有些货物需要搬到地下的仓库,需要通过电梯运输。但是电梯的容量有限,如果电梯走了,其他使用电梯的人就必须等待。
这里电梯可以看作一个**受限的资源**或者**同步区域**。在这里等待是必须的,所以这里的矛盾就是需要使用的资源是有限的。
再来看一下操作系统对于CPU的调度:
假设一个单核的CPU,只能运行一个线程,但是现在有多个线程要运行,怎么办?你可以让CPU在不同的线程之间切换,每个线程只准运行一小段时间。
只要切换的速度够快,给人的感觉就好像是在同时运行多个线程。那么在这里线程切换的意义就在于提升交互体验。
线程同步本来就是为了控制两段在不同线程中执行顺序。一般是event等事件来控制这个流程
还有一种就是不关心执行顺序,只关心两个线程不能同时访问,这个就是就是加锁互斥。
多线程同步就是可以只把某些代码做先后顺序控制,但是其它代码没有控制的就可以多个线程同时执行。这个不象单线程永远都是顺序的
多线程只有同步和异步之分,没有同步和串行。
串行一般只代码一行行有序执行。至于同步异步实际不关心。
我的意思是如果同步了,不就跟顺序执行一个意思了么,执行完一个块再执行另一个块,那这样的话多线程的同步实际上没有实现并发啊,这个时候的多线程是为了什么呢
其实多线程你可以看做是几条执行程序的执行过程的,多线程是用来处理一些需要相对同时解决问题的问题的。
同步是指多个线程访问同一个资源时防止两个线程交错执行引发数据异常
比如Windows下就可以用事件对象,互斥体,自旋锁,信号灯,快速互斥体(快速互斥体限驱动程序专用)来进行线程同步。
线程同步本质上就是让在一个线程运行时其他线程等待(挂起或自旋),当线程完成后,其他线程被激活,因为现代操作系统是多任务抢占式的系统,系统可能随时进行上下文切换,因此线程同步显得非常重要。
至于串行,打个比方,某个设备只能支持同时接收线路上的一个请求,那么就需要设备的驱动程序实现串行化,把请求添加到一个处理队列中,先来先处理,一个个处理。
PS:同步和串行是两个概念,同步和异步相对,串行与并行相对,二者没有绝对的关系
http://blog.csdn.net/rfjian123/article/details/9289999
没错,同步的代码,从本质上说,相当于串行(非并发)执行。
对于同步区域的访问,多个线程相当于是串行执行的(谁先获得访问的权限,谁先去执行)
但是,这个与传统的串行程序是不一样的。这里串行的区间只是“同步区域”,而并非整个程序。
顺序执行是单线程从上往下执行代码,而一段代码被锁住是指这段代码锁在一个线程上,此线程是顺序执行,其他线程不能在解锁前执行,这是防止线程竞争同一个资源
并发可以理解为,多个线程同时访问同一资源,就比如淘宝,同时有几亿个用户同时访问,所以阿里投入上百万台服务器进行负载均衡,而串行是指所有
的线程有序进行,比如某一个应用被某个线程所占用,那另一个线程就得等待正在执行的线程释放后才能执行有点类似于锁机制,而并发与串行的本质区别就
在于一个会引发安全问题,而串行不会,但并发能大大提工作效率(实际上是对资源的利用率)