博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程知识点,线程各状态之间转换
阅读量:4181 次
发布时间:2019-05-26

本文共 1791 字,大约阅读时间需要 5 分钟。

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锁住整张表。

转载地址:http://vrqai.baihongyu.com/

你可能感兴趣的文章
《Linux内核编程》第七章:USB CORE与USB键鼠驱动
查看>>
《Android系统学习》之JAVA与C混合编程——JNI
查看>>
《C预处理》之#ifndef
查看>>
Android边录边播应用
查看>>
《Linux内核编程》第十三章:Linux对进程内存的二级页式管理
查看>>
ARM协处理器
查看>>
《miniOS分析》前言
查看>>
《Linux内核编程》第十四章:Linux驱动基础
查看>>
Linux平台下ARM-Linux交叉编译工具链
查看>>
Window平台下ADS自带ARMCC编译工具链
查看>>
micro2440/tiny6410使用JLINK直接烧录nand flash
查看>>
C编译器、连接器与可执行机器码文件
查看>>
android linker 浅析
查看>>
802.11 traffic id
查看>>
Android系统wifi分析-手动连接过程
查看>>
设置IP别名Shell脚本
查看>>
Source Insight 宏-单行注释
查看>>
levelDB源码分析-Arena
查看>>
levelDB源码分析-SSTable
查看>>
平滑升级Nginx的Shell脚本
查看>>