java多线程中使用同步那它和单线程有什么区别?

问题描述

如果在多线程中使用同步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个同学做呢?(单线程,还是多线程)

牛逼的解释。

时间: 2024-08-30 15:50:18

java多线程中使用同步那它和单线程有什么区别?的相关文章

java多线程中两个容器之间的同步

问题描述 java多线程中两个容器之间的同步 写了一个多线程的爬虫(对多线程不熟悉),但是每次队列中都有重复的元素,我把代码逻辑贴上来,大家帮我看一下,谢谢了: 在进程中: queue = LinkedBlockingQueue set = ConcurrentSkipListSet 在每个进程中使用了bfs bfs: while(!queue.empty()){ s = queue.poll() //...逻辑代码 set.add(s) //对s所有子状态扩展 for(son : s.sons

java多线程中的volatile和synchronized用法分析_java

本文实例分析了java多线程中的volatile和synchronized用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package com.chzhao; public class Volatiletest extends Thread {     private static int count = 0;     public void run() {         count++;     }     public static void main(String

关于java多线程中的join方法

问题描述 关于java多线程中的join方法 1.主线程可能在子线程结束之前 结束吗?如果可能的话 举一个例子 2.如何理解join方法, 结合实际应用. 非常感谢非常感谢!!! 解决方案 关于join,参考:http://www.blogjava.net/jnbzwm/articles/330549.html 解决方案二: 主线程可能在子线程结束之前 结束吗 一般来说不可以,但是也不一定,如果子线程在执行finally中的代码,应该会等它执行完了才退出. 晕,join方法和什么"让主线程等子线

多线程问题-新手求助关于Java多线程中启动线程问题

问题描述 新手求助关于Java多线程中启动线程问题 public class Example15_1 { /** * @param args */public static void main(String[] args) { // TODO Auto-generated method stub SpeakHello speakHello; SpeakNinhao speakNinhao; speakHello = new SpeakHello(); speakNinhao= new Speak

Java多线程中的ThreadLocal,可继承,可修改

Java多线程中的ThreadLocal,可继承,可修改. package test; import java.util.Date; public class InheritableThreadLocalExt extends InheritableThreadLocal<Object>{ @Override protected Object initialValue() { return new Date().getTime(); } @Override protected Object c

详解Java编程中线程同步以及定时启动线程的方法_java

使用wait()与notify()实现线程间协作 1. wait()与notify()/notifyAll()调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁.这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中.可以通过notify()/notifyAll(),或者时间到期,从wait()中恢复执行. 只能在同步控制方法或同步块中调用wait().notify()和notifyAll().如果在非同步的方法里调用这些方法,在运

深入探讨Java多线程中的volatile变量_java

volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性. 什么是线程的可见性: 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据.可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 -- 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前

Java多线程-线程的同步与锁的问题_java

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package cn.thread; public class Foo { private int x = 100; public int getX() { return x; } public int fix(int y) { x = x - y; return x; } } package cn.thread

Java多线程中的两个问题

多线程|问题 多线程中Thread.stop()被废弃的原因:当调用Thread.stop()方法时,该线程将释放先前其控制的所有资源,而在线程没有正常执行完毕之前强迫Stop之后,这些资源可能处在一种不一致的状态,而这些处于不一致的状态的资源被其他的线程所使用之后,就可能会发生一些意想不到的错误.实现时间差事件的解决办法:在主线程中设置一个状态变量,在响应线程执行时,先sleep()一个固定的时间段,之后检查主线程的这个状态,如果这个状态不同就执行不同的操作,或停止执行.可以通过回调机制来实现