本文是总结知乎上面的知识点,虽然忘记了具体的连接地址,可是仍是很是感谢知乎里面各位大神的分享!java
java 中使用 synchronized 是用来 表示该资源或者该方法是不能进行多个线程的共享的,因此当多个线程都在请求该资源的时候,就跟串行是同样的也就是单线程效果同样,可是当不为共享的时候就能够利用并发来大大的提升系统的效率。一、多线程并不解决软件执行效率和你硬件系统的瓶颈,它只是达到更高效使用你的硬件系统资源。二、从本质上来讲,单核单CPU不存在并行,即便多线程也是串行,多线程不会提升CPU利用率。三、对于同步块与单线程执行比较,并不存在多少性能差别,若是相比较,同步块的执行效率还要大大低于单线程程序,若是设计差,可能仍是灾难级的。由于同步自己就须要占用系统资源和CPU片断,并且每一个线程本身也须要占用资源,若是多线程达不到多线程的优点,那么它自己就会下降效率。例以下载一首歌曲为10M,采用单线程的方式,那么只能从开头到结束,若是中途出现了什么问题,那么它就不能往下执行了,若是使用多线程,例如开辟2个线程,那么每一个线程能够下载5M,这就涉及到一个断点下载的问题了,效率确定比单线程快,若是里面包含synchronized方法,那么第一个线程在进行任务了,忽然出现了什么问题,那么咱们可让第二个线程执行任务,相比于单线程来讲效率更高其实设计synchronized的目的是在使用多线程的时候从安全性方面去考虑的,例如在一个方法中修改一个全局变量,若是使用单线程固然是没什么问题的,一个线程进来我就本身一我的修改,也不会影响什么,可是若是在多线程环境中,不少线程同时访问这个方法修改全局变量,那么就可能会出问题了,可能你争我抢(分配到CPU资源)把这个全局变量改的不成样子了,因此考虑安全性,咱们使用synchronized,若是有多个线程,表示大家得一个一个排队来,若是我进去方法里面了,那么我就把门给锁上,只有我一个在里面修改全局变量,大家都不能进来,等我处理完成了,我再释放锁,而后让下一个进来修改,这样也就确保了全局变量不会被改的乱七八糟不成样子了,由于不少项目中会有这样的需求,因此咱们得根据需求来肯定相应的解决方案!!举个例子来讲,你有100份英语卷子,有听力,选择题和做文三部分;每部分作完以后,必须把100份卷子都交上来之后,才能拿下一部分。一块儿拿下一部分的动做就叫作同步,你是拿叫一个同窗作,仍是叫100个同窗作呢?(单线程,仍是多线程)一个进程中若是有多个线程,那么执行多线程中的非同步代码时比一个进程只有一个线程快。若是进程中有多个线程可是每一个线程的全部代码都须要同步的话就和进程只有一个线程的效率是相同的。线程是在进程中的,一个进程能够有多个线程,单个线程不能脱离进程存在。因此楼主的问题就是单进程中多线程为什么优于多进程(每一个进程对应一个线程),当同步时,看上去也都是一个线程在执行,但前者的效率将远远高于后者。由于多线程是共享进程中的数据的,共享数据使得线程之间的通讯比进程间通讯更快更有效。同时,不少时候,线程相对于进程属于轻量级的,更便于建立和销毁。ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuffer是线程安全的。非线程安全是指多线程操做同一个对象可能会出现问题。而线程安全则是多线程操做同一个对象不会有问题。线程安全必需要使用不少synchronized关键字来同步控制,因此必然会致使性能的下降。因此在使用的时候,若是是多个线程操做同一个对象,那么使用线程安全的Vector;不然,就使用效率更高的ArrayList。非线程安全!=不安全有人在使用过程当中有一个不正确的观点:个人程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。非线程安全并非多线程环境下就不能使用。注意我上面有说到:多线程操做同一个对象。注意是同一个对象。好比最上面那个模拟,就是在主线程中new的一个ArrayList而后多个线程操做同一个ArrayList对象。若是是每一个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么确定是没问题的。线程安全的实现线程安全是经过线程同步控制来实现的,也就是synchronized关键字。 ------------------------------------------------------同步异步区别--------------------------------------------------------他们最大的区别:同步须要等待,而异步无需等待。例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干别的事。异步: 请求经过事件触发->服务器处理(这是浏览器仍然能够做其余事情)->处理完毕。说的再通俗易懂点同步是按顺序执行,执行完一个再执行下一个,须要等待、协调运行。异步就是彼此独立,在等待某事件的过程当中继续作本身的事,不须要等待这一事件完成后再工做。线程就是异步实现的一个方式。异步是让调用方法的主线程不须要同步等待另外一线程的完成,从而可让主线程干其它的事情。 异步和多线程并非一个同等关系,异步是最终目的,多线程只是咱们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而能够作其它的事情。实现异步能够采用多线程技术或则交给另外的进程来处理。同步和异步区别:(好处和坏处)同步能够避免出现死锁,读脏数据的发生。通常共享某一资源的时候用,若是每一个人都有修改权限,同时修改一个文件,有可能使一我的读取另外一我的已经删除的内容,就会出错,同步就会按顺序来修改。可是,同步须要等待资源访问结束,浪费时间,效率低。 异步则能够提升效率,如今cpu都是双核,四核,异步处理的话能够同时作多项工做,固然必须保证是能够并发处理的。可是安全性较低。http://blog.csdn.net/xiao__gui/article/details/8934832其实,异步是目的,而多线程是实现这个目的的方法。异步是说,A发起一个操做后(通常都是比较耗时的操做,若是不耗时的操做就没有必要异步了),能够继续自顾自的处理它本身的事儿,不用干等着这个耗时操做返回 而线程的适用范围则是那种须要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。可是往 往因为使用线程编程的简单和符合习惯,因此不少朋友每每会使用线程来执行耗时较长的I/O操做。这样在只有少数几个并发操做的时候还无伤大雅,若是须要处 理大量的并发操做时就不合适了。异步与多线程,从辩证关系上来看,异步和多线程并不时一个同等关系,异步是目的,多线程只是咱们实现异步的一个手段.什么是异步:异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回.实现异步能够采用多线程技术或则交给另外的进程来处理=========================================================================线程池的实现方法与线程是不同的.初始化时在线程池里的线程为0.当进程须要一个线程时,建立一个线程,由此线程执行用户的方法.须要注意的是,此线程执行完后并不当即销毁,而是挂起等待,若是有其余方法须要执行,回唤醒进行处理.只有当它等到40秒(没有官方记录,有多是其它数字)尚未任务执行时才唤醒本身,并销毁本身,释放资源.固然,若是线程池中的线程不够处理任务时,会再次建立一个新线程进行执行.异步执行也得执行,不在当前线程执行,固然得去另一个线程执行。异步一般用系统线程池的线程,一般状况下性能好些。(由于能够屡次利用,申请时不须要从新申请一个线程,只须要从池里取就好了。)异步是一种效果,多线程是一种具体技术。能够说,用“多线程”实现“异步”。异步和多线程是两个不一样的概念,不能这样比较.异步请求通常用在IO等耗时操做上,他的好处是函数调用当即返回,相应的工做线程当即返还给系统以供重用。因为系统的线程资源是很是宝贵的,一般有必定的数目限制,如.net默认是25。若使用异步方式,用这些固定数目的线程在固定的时间内就能够服务更多的请求,而若是用同步方式,那么每一个请求都自始至终占用这一个线程,服务器能够同时服务的请求数就少了。当异步操做执行完成后,系统会从可用线程中选取一个执行回调程序,这时的这个线程多是刚开始发出请求的那个线程,也多是其余的线程,由于系统选取线程是随机的事情,因此不能说绝对不是刚开始的那个线程。多线程是用来并发的执行多个任务。不过有个问题,异步有时优先级比主线程还高。这个特色和多线程不一样。