1.多线程的优缺点
优点:
1.使程序的相应速度更快,
2.高效利用cpu资源,当前没有进行处理的任务可以将处理器时间让给其他任务;占用大量处理时间的任务可以定期将处理器时间让给其它任务。
3.可以随时停止任务。
4.分别设置各个任务的优先级以及优化性能
缺点:
1.可能会造成线程死锁;
2.等待共享资源时造成程序的运行速度变慢;
3.需要花费额外的cpu资源对线程进行管理。
2.start()方法和run()方法简介和区别
start()方法:
1.start用于启动线程,真正实现多线程运行。可以让代码直接执行start下面的方法。
2.调用start()方法让线程进入就绪(可运行)状态,此时并没有运行,当获取到cpu执行权后自动执行run()方法。
run()方法:
run()方法只是Thread类的普通方法,调用后仍然在当前主线程中运行。
3.volatile关键字的作用?
多线程使用volatile修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile修饰的变量都是最新的。(原理:每次获取该变量直接读取该变量的内容,而不从缓存中读取。)
4.volatile和synchronized对比
| volatile | synchronized |
使用范围 | 只能修饰变量 | 变量、方法、类 |
作用 | 仅实现变量的可见性 | 可以保证变量的可见性和原子性 |
执行效率 | 不会造成线程阻塞 | 锁住当前变量,可能会阻塞其它线程 |
5.Lock和synchronized区别
1.Lock是一个接口,synchronized是关键字。
2.Lock必须主动在finally块通过unLock()释放锁,可能造成死锁;synchronized遇到异常,自动释放线程占用的锁对象
3.Lock可让等待锁对象的线程相应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能相应中断;
4.通过Lock可以知道是否成功获取到锁,synchronized则不行
5.Lock可以提高多个线程进行读操作的效率
6.JDK1.6对synchronized加入许多优化,比如自适应自旋、锁消除、锁初花、轻量级锁、偏向锁等,故synchronized的性能并不比Lock差。提倡优先考虑synchronized来进行同步。
6.怎么唤醒一个阻塞的线程?
线程状态转换图:
如果线程因为调用了wait()、sleep()、或者join()方法而导致的阻塞,可以中断线程,并且抛出InterruptedException来唤醒它;如果遇到IO阻塞,无能为力(因为IO是操作系统实现的,Java代码无法直接接触到OS)。
7.Java如何获取到线程dump文件?
首先我们说下dump文件:故障定位(尤其是内存溢出)和性能分析时,经常用到一些文件类帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况。
常见的有heap dump[主要是记录内存信息]和thread dump(也叫javacore或java dump)[记录CPU信息]
dump文件作用:死循环、死锁、阻塞、页面打开慢等问题,打线程dump是最好的解决途径,因此线程dump也叫线程堆栈。
获取步骤:
1.获取线程pid:ps -ef | grep java
2.打印线程堆栈jstack pid
整合命令:ps -ef | grep java | grep -v grep |awk '{print $2}' | xargs jstack
8.sleep()和wait()区别
| sleep() | wait() |
定义 | Thread类的方法 | Object类的方法 |
效果 | 都能冻结当前线程 | |
使用 | 必须指定时间,在该时间内线程睡眠,进入临时阻塞状态 | 如果没有设置时间,线程一直阻塞,必须通过notify或notifiAll()唤醒 |
锁:都释放cpu资源 | 不释放锁 | 释放锁 |
9.ThreadLoacal的作用
ThreadLocal是线程安全的存储机制。即在当前线程中的不同方法之间共享一个对象。
10.ConcurrentHashMap的并发度?
ConcurrentHashMap采用锁分段技术,默认并发度是segment的大小,默认是16
Hashtable锁住整张表。