问题描述
如果在多线程中使用同步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个同学做呢?(单线程,还是多线程)
牛逼的解释。