
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了java程序员学习多线程技术的时候需要掌握的一些基础知识点等内容,而本文我们就再来了解一下,线程状态与volatile关键词应用。
1、线程的状态
New:新创建的线程,尚未执行;
Runnable:运行中的线程,正在执行run()方法的Java代码;
Blocked:运行中的线程,因为某些操作被阻塞而挂起;
Waiting:运行中的线程,因为某些操作在等待中;
TimedWaiting:运行中的线程,因为执行sleep()方法正在计时等待;
Terminated:线程已终止,因为run()方法执行完毕。
当线程启动后,它可以在Runnable、Blocked、Waiting和TimedWaiting这几个状态之间切换,直到后变成Terminated状态,线程终止。
线程终止的原因有:
线程正常终止:run()方法执行到return语句返回;
线程意外终止:run()方法因为未捕获的异常导致线程终止;
对某个线程的Thread实例调用stop()方法强制终止(过时方法,不推荐使用)。
2、volatile
volatile关键字解决的是共享变量的可见性问题:当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改后的值。它的原理是什么呢?这涉及到Java的内存模型(JMM)。
在Java内存模型中,内存有主内存、工作内存之分。主内存保存共享变量,比如类变量、实例变量;工作内存是每个线程独有的,工作内存保存私有变量,比如方法局部变量。
在Java虚拟机中,当一个线程访问共享变量时,它会先获取共享变量的一个副本,并保存在自己的工作内存中。如果线程修改了共享变量的值,虚拟机会在某个时刻把修改后的值回写到主内存,但是,这个时间是不确定的!
这会导致一个问题,如果一个线程更新了某个共享变量,另一个线程读取到的值可能还是更新前的。例如,主内存的变量a=true,线程1执行a=false时,它在此刻仅仅是把变量a的副本变成了false,主内存的变量a还是true,在JVM把修改后的a回写到主内存之前,其他线程读取到的a的值仍然是true,这就造成了多线程之间共享的变量不一致。
因此,volatile关键字的目的是告诉虚拟机:
每次访问变量时,总是获取主内存的新值;
每次修改变量后,立刻回写到主内存。
volatile解决可见性问题,但不能保证原子性,原子性问题需要根据实际情况做同步处理,因为原子性问题本质上是多线程调度的不确定性造成的。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。