1:并行和并发有什么区别
1:并发
多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。
2:并行
单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的同时进行。
3:串行
有n个任务,由一个线程按顺序执行。由于任务、方法都在一个线程执行所以不存在线程不安全情况,也就不存在临界区的问题。
4:总结
做一个形象的比喻
并发 = 两个队列和一台咖啡机。
并行 = 两个队列和两台咖啡机。
串行 = 一个队列和一台咖啡机。
2:线程和进程的区别
1:进程
进程是一个“执行中的程序”,是系统进行资源分配和调度的一个独立单位。
2:线程
线程是进程的一个实体,一个进程中一般拥有多个线程。线程之间共享地址空间和其它资源(所以通信和同步等操作,线程比进程更加容易)
3:区别
线程一般不拥有系统资源,但是也有一些必不可少的资源(使用ThreadLocal存储)
线程上下文的切换比进程上下文切换要快很多。
线程上下文切换比进程上下文切换快的原因,可以总结如下:
进程切换时,涉及到当前进程的CPU环境的保存和新被调度运行进程的CPU环境的设置线程切换时,仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作。
3:并发编程有什么优点和缺点
1:优点
充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。
2:缺点
并发编程的目的就是为了能提高程序的执行效率,提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、线程安全、死锁等问题。
4:请描述线程状态及状态之间的转换?
同步的实现方法有五种,分别是synchronized、wait与notify、sleep、suspend、join
1:synchronized
一直持有锁,直至执行结束
2:wait
使一个线程处于等待状态,并且释放所持有的对象的锁,需捕获异常。
3:sleep
使一个正在运行的线程处于睡眠状态,是一个静态方法,需捕获异常,不释放锁。
sleep()方法是Thread类中方法,而wait()方法是Object类中的方法。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态,在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。
4:notify
唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
5:notityAll
唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
5:sleep和wait的区别?
1:类的不同
sleep() 是 Thread线程类的静态方法,wait() 是 Object类的方法。
2:是否释放锁
sleep() 不释放锁;wait() 释放锁。
3:用途不同
Wait 通常被用于线程间交互/通信,sleep 通常被用于暂停执行。
4:用法不同
wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用wait(long timeout)超时后线程会自动苏醒。