1.线程安全和非线程安全
(1)java面试中常见问答,如下:
<1>ArrayList是非线程安全的,Vector是线程安全的;
<2>HashMap是非线程安全的,HashTable是线程安全的;
<3>StringBuilder是非线程安全的,StringBuffer是线程安全的
(2)非线程安全是指多线程操作同一个对象可能会出现问题
(3)线程安全则是多线程操作同一个对象不会有问题
(4)线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低
(5)在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList
2.非线程安全!=不安全
(1)非线程安全并不是多线程环境下就不能使用
<1>多线程操作同一个对象(就是在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象)
<2>如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的
(2)线程安全的实现:通过线程同步控制来实现的
<1>在并发量比较小的情况下,使用synchronized关键字
<2>在并发量比较高的情况下,其性能下降会很严重,使用ReentrantLock
(3)synchronized关键字和ReentrantLock区别
<1>synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否
<2>ReentrantLock是使用代码实现的,系统无法自动释放锁,需要在代码中的finally子句中显式释放锁lock.unlock()。
3.同步异步区别
(1)最大区别:同步需要等待,而异步无需等待
(2)同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干别的事
<1>同步是按顺序执行,执行完一个再执行下一个,需要等待、协调运行
<2>同步可以避免出现死锁,读脏数据的发生
<3>同步需要等待资源访问结束,浪费时间,效率低
<4>同步是实现线程安全的方法
(3)异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
<1>异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作
<2>异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情
<3>线程就是异步实现的一个方式
<4>异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情
<5>异步则可以提高效率,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的,安全性较低
4.异步与多线程
(1)异步和多线程并不是一个同等关系,异步是最终目的,多线程只是实现异步的一种手段,一种方式
(2)实现异步可以采用多线程技术或则交给另外的进程来处理
(3)多线程是用来并发的执行多个任务
<1>比较容易的实现了异步切换的思想,因为异步的程序很难写的,但是多线很容易写, 相对效率也高
<2>多线程可以实现线程间的切换执行
<3>多线程本身还是以同步完成,效率是比不上异步的
(4)异步请求一般用在IO等耗时操作,异步有时优先级比主线程还高。这个特点和多线程不同
5.并发和并行
(1)并行是不同实体上的多个事件,并发是在同一实体上的多个事件
<1>并行:在操作系统中,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的
<2>并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,
且这几个程序都是在同一个 处理机上运行,但任一个时刻点上只有一个程序在处理机上运行
(2)单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主)
<1>要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)
<2>并发通常指提高运行在单处理器上的程序的性能
<3>并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发
(3)在多CPU系统中,可以让两个以上的线程同时运行
<1>这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)
<2>在多处理器上的程序才可实现并行处理
(4)并发与并行实例
<1>并发:交替做不同事情的能力
例子:吃饭吃到一半,电话来了,你停下吃饭,接电话,接完电话后继续吃饭,支持并发
<2>并行:同时做不同事情的能力
例子:吃饭吃到一半,电话来了,你一边吃饭一遍接电话,支持并行
<3>顺序执行:吃饭吃到一半时,电话来了,你一直吃完饭才去接电话,既不支持并发也不支持并行
6.异步,高并发,多线程
(1)多线程是异步的实现方式,是java的特性
(2)多线程对应的是cpu,高并发对应的是访问请求
(3)多线程是处理高并发的一种编程方法,即并发需要用多线程实现(多线程只是其中解决方法之一)