和Thread的区别,线程同步异步的区别

主题 : 多线程同步和串行的区别
级别: 侠客
UID: 532869
可可豆: 503 CB
威望: 393 点
在线时间: 210(时)
发自: Web Page
来源于&&分类
多线程同步和串行的区别&&&
求大神点拨多线程同步和串行的区别。&&我是百思不得其解从网上查的同步: 只能在当前线程按先后顺序依次执行,不开启新线程。串行: 线程执行只能依次逐一先后有序的执行。感觉是一个意思,求指导。
级别: 精灵王
发帖: 3023
可可豆: 3353 CB
威望: 3331 点
在线时间: 4750(时)
发自: Web Page
引用 引用楼主puyuankai于 10:47发表的 多线程同步和串行的区别 :求大神点拨多线程同步和串行的区别。  我是百思不得其解从网上查的同步: 只能在当前线程按先后顺序依次执行,不开启新线程。串行: 线程执行只能依次逐一先后有序的执行。....... 与同步对应的是异步,与串行对应的是并行。同步和串行不是同一类东西。我举个例子好了:假设我们主线程分出一条线程A异步进行工作,当A的工作完成后需要将数据传回主线程,这时我们需要将A同步到主线程。说串行前先说说调派队列,调派队列分串行和并行,一个队列包含一个或多个任务,它们根据串行或并行来执行。主线程所在的队列是主队列,是一个串行队列。我们一般说的同步到主线程,实际上就是将一个任务插到主队列尾部执行。异步串行队列有一个特点,就是没次执行任务都会分配一个线程,例如执行任务A要开出线程1,当任务A完成了以后线程1就会回到线程池,这时再执行任务B的话,系统会继续重池中找空闲的线程,所以很大可能也是线程1。至于同步的串行队列,可以认为它一直在调用它的线程上执行直到结束。
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)java多线程中使用同步那它和单线程有什么区别?
作者:用户
浏览:661 次
如果在多线程中使用同步synchronized比如有100个线程,所有线程都要一个一个的执行,那这和单线程不是一样了吗?并且多线程同步的时候操作系统来回的检查锁的状态倒浪费了性能,我理解的是不是哪里不
如果在多线程中使用同步synchronized比如有100个线程,所有线程都要一个一个的执行,那这和单线程不是一样了吗?并且多线程同步的时候操作系统来回的检查锁的状态倒浪费了性能,我理解的是不是哪里不对啊,请知道的帮解答一下,还有就是关于同步有很多方法,是不是都一回事只要会一种就行啊比如我就知道在run里synchronized(obj)这样解决方案
解决方案二:它们的目的是相同的,都可以很好控制程序执行流程;多线程是为了提高CPU的利用率,在某个线程高速缓存或者执行等待时,可以通知其它线程执行,需要考虑执行效率的多任务的程序中可以考虑使用多线程。同步方法的比较可以参照这个:解决方案三:线程是在进程中的,一个进程可以有多个线程,单个线程不能脱离进程存在。所以楼主的问题就是单进程中多线程为何优于多进程(每个进程对应一个线程),当同步时,看上去也都是一个线程在执行,但前者的效率将远远高于后者。因为多线程是共享进程中的数据的,共享数据使得线程之间的通信比进程间通信更快更有效。同时,很多时候,线程相对于进程属于轻量级的,更便于创建和销毁。解决方案四:执行代码的逻辑分开了.解决方案五:WINDOWS中CPU的分配基于线程,每个线程的所有代码不一定都是加锁的,所以一个进程中如果有多个线程,那么执行多线程中的非同步代码时比一个进程只有一个线程快。如果进程中有多个线程但是每个线程的所有代码都需要同步的话就和进程只有一个线程的效率是相同的。解决方案六:楼主是说多个线程synchronized一个块的时候多线程是不是串行执行了?实际上是的。但是除了synchronized块内的方法其他的内容是多线程执行的。所以还是并行执行的效率还是比单线程快的目前来说如果程序中有遇到必须需要串行执行的地方,一般我都会采用从数据库层分离数据来保证程序是真正的多线程而不是采用synchronized解决方案七:举个例子来说,你有100份英语卷子,有听力,选择题和作文三部分;每部分做完之后,必须把100份卷子都交上来以后,才能拿下一部分。一起拿下一部分的动作就叫做同步,你是拿叫一个同学做,还是叫100个同学做呢?(单线程,还是多线程)解决方案八:引用6楼skgary的回复:举个例子来说,你有100份英语卷子,有听力,选择题和作文三部分;每部分做完之后,必须把100份卷子都交上来以后,才能拿下一部分。一起拿下一部分的动作就叫做同步,你是拿叫一个同学做,还是叫100个同学做呢?(单线程,还是多线程)、例子不错,尽管用synchronized会降低效率解决方案九:引用6楼skgary的回复:举个例子来说,你有100份英语卷子,有听力,选择题和作文三部分;每部分做完之后,必须把100份卷子都交上来以后,才能拿下一部分。一起拿下一部分的动作就叫做同步,你是拿叫一个同学做,还是叫100个同学做呢?(单线程,还是多线程)通俗易懂解决方案十:比如做饭单线程:煮饭-&饭熟后洗菜-&切菜-&炒菜-&炖肉多线程:者饭,同时洗菜,洗完菜后可以炖肉,在炖肉的同时可以切别的菜,炒别的菜解决方案十一:使用同步是为了不引起数据操作的异常,其实对于单CPU来说,多线程其实也算是单线程,只不过是单线程一般只能完成一条线上的事。如果你的主界面线程在处理数据,那这时你点击了界面的按钮,他要响应,单线程就卡死了。多线程中同步在很多地方都有用到的,确实在用他的时候,只能有一个线程来访问,其实线程都在等待。但是有时单线程有很多问题,比如上面说的那个,还有比如,网上买火车票,你总不能把所有人要买票时都弄到一个线程去。那你得让人家等多久呀,得一个人全买完票了,其它人才能买。解决方案十二:任意时刻,只有一个线程在处理任务,从这一点看,跟单线程没有区别;但是,可以保护数据:同步块内的数据,假如不允许多个线程同时读写的话,就需要加上同步控制了。解决方案十三:多线程和单线程的区别,在于资源安全,如果不涉及这个,单多线程你想怎么看都行。解决方案十四:例如下载一首歌曲为10M,采用单线程的方式,那么只能从开头到结束,如果中途出现了什么问题,那么它就不能往下执行了,如果使用多线程,例如开辟2个线程,那么每个线程可以下载5M,这就涉及到一个断点下载的问题了,效率肯定比单线程快,如果里面包含synchronized方法,那么第一个线程在进行任务了,突然出现了什么问题,那么我们可以让第二个线程执行任务,相比于单线程来说效率更高其实设计synchronized的目的是在使用多线程的时候从安全性方面去考虑的,例如在一个方法中修改一个全局变量,如果使用单线程当然是没什么问题的,一个线程进来我就自己一个人修改,也不会影响什么,但是如果在多线程环境中,很多线程同时访问这个方法修改全局变量,那么就可能会出问题了,可能你争我抢(分配到CPU资源)把这个全局变量改的不成样子了,所以考虑安全性,我们使用synchronized,如果有多个线程,表示你们得一个一个排队来,如果我进去方法里面了,那么我就把门给锁上,只有我一个在里面修改全局变量,你们都不能进来,等我处理完成了,我再释放锁,然后让下一个进来修改,这样也就确保了全局变量不会被改的乱七八糟不成样子了,因为很多项目中会有这样的需求,所以我们得根据需求来确定相应的解决方案!!解决方案十五:java中使用synchronized是用来表示该资源或者该方法是不能进行多个线程的共享的,所以当多个线程都在请求该资源的时候,就跟串行是一样的也就是单线程效果一样,但是当不为共享的时候就可以利用并发来大大的提高系统的效率。解决方案:进程和线程的知识是编码中最难理解的知识之一,本质来说它是操作系统层面的问题。就你问题而言,有几点必须说明。1、多线程并不解决软件执行效率和你硬件系统的瓶颈,它只是达到更高效使用你的硬件系统资源。2、从本质上来说,单核单CPU不存在并行,即使多线程也是串行,多线程不会提高CPU利用率。3、对于同步块与单线程执行比较,并不存在多少性能差异,如果相比较,同步块的执行效率还要大大低于单线程程序,如果设计差,可能还是灾难级的。因为同步本身就需要占用系统资源和CPU片段,而且每个线程自己也需要占用资源,如果多线程达不到多线程的优势,那么它本身就会降低效率。4、是否使用多线程和同步,是个设计问题,它们之间不能互相取代,是需要根据具体的情况来分别设计的。总结一下就是,多线程,同步和单线程从根本上并无比较可能性,因为它们都是针对型设计,既然环境补贴,就没有比较。解决方案:引用6楼skgary的回复:举个例子来说,你有100份英语卷子,有听力,选择题和作文三部分;每部分做完之后,必须把100份卷子都交上来以后,才能拿下一部分。一起拿下一部分的动作就叫做同步,你是拿叫一个同学做,还是叫100个同学做呢?(单线程,还是多线程)牛逼的解释。
【云栖快讯】新年大招!云栖社区为在读大学生/研究生准备了一份学(huan)习(zhuang)攻略,发布博文即有机会赢得iPad mini 4等大奖,学习换装两不误!欢迎报名参与~&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供匿名用户不能发表回复!|17:35 提问
请问多线程的同步和串行有什么区别
如果一段代码被锁住执行完再去执行另一段代码,这和顺序执行有什么区别呢,求各位大神解答啊
按赞数排序
没错,同步的代码,从本质上说,相当于串行(非并发)执行。
多线程只有同步和异步之分,没有同步和串行。
串行一般只代码一行行有序执行。至于同步异步实际不关心。
同步是指多个线程访问同一个资源时防止两个线程交错执行引发数据异常
比如Windows下就可以用事件对象,互斥体,自旋锁,信号灯,快速互斥体(快速互斥体限驱动程序专用)来进行线程同步。
线程同步本质上就是让在一个线程运行时其他线程等待(挂起或自旋),当线程完成后,其他线程被激活,因为现代操作系统是多任务抢占式的系统,系统可能随时进行上下文切换,因此线程同步显得非常重要。
至于串行,打个比方,某个设备只能支持同时接收线路上的一个请求,那么就需要设备的驱动程序实现串行化,把请求添加到一个处理队列中,先来先处理,一个个处理。
PS:同步和串行是两个概念,同步和异步相对,串行与并行相对,二者没有绝对的关系
看得出来,楼主对于并发和多线程的一些概念理解上和大家有些出入,而且缺乏实际的经验。
这里打个比方,借用超市运货来说明:
有一家超市要把货搬到仓库里,可以选择一个人来搬货(**单线程**)或者多叫几个人来搬货(**多线程**)。很显然在这里并发提升了效率。
继续深入这个场景,假设有些货物需要搬到地下的仓库,需要通过电梯运输。但是电梯的容量有限,如果电梯走了,其他使用电梯的人就必须等待。
这里电梯可以看作一个**受限的资源**或者**同步区域**。在这里等待是必须的,所以这里的矛盾就是需要使用的资源是有限的。
再来看一下操作系统对于CPU的调度:
假设一个单核的CPU,只能运行一个线程,但是现在有多个线程要运行,怎么办?你可以让CPU在不同的线程之间切换,每个线程只准运行一小段时间。
只要切换的速度够快,给人的感觉就好像是在同时运行多个线程。那么在这里线程切换的意义就在于提升交互体验。
我的意思是如果同步了,不就跟顺序执行一个意思了么,执行完一个块再执行另一个块,那这样的话多线程的同步实际上没有实现并发啊,这个时候的多线程是为了什么呢
其实多线程你可以看做是几条执行程序的执行过程的,多线程是用来处理一些需要相对同时解决问题的问题的。
对于同步区域的访问,多个线程相当于是串行执行的(谁先获得访问的权限,谁先去执行)
但是,这个与传统的串行程序是不一样的。这里串行的区间只是“同步区域”,而并非整个程序。
线程同步本来就是为了控制两段在不同线程中执行顺序。一般是event等事件来控制这个流程
还有一种就是不关心执行顺序,只关心两个线程不能同时访问,这个就是就是加锁互斥。
多线程同步就是可以只把某些代码做先后顺序控制,但是其它代码没有控制的就可以多个线程同时执行。这个不象单线程永远都是顺序的
顺序执行是单线程从上往下执行代码,而一段代码被锁住是指这段代码锁在一个线程上,此线程是顺序执行,其他线程不能在解锁前执行,这是防止线程竞争同一个资源
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐

我要回帖

更多关于 线程的同步和异步 的文章

 

随机推荐