第五章:多线程深入话题

优雅的停止线程

   在多线程操作之中如果要启动多线程肯定使用的是Thread类中的start()方法,而如果对于多线程需要进行停止处理,Thread类原本提供的有stop方法,但是对于这些方法从jdk1.2之后就已经将其废除了,而且一直到现在也不再建议使用了,而除了stop()方法之外,还有几个方法也被禁用了:

  

之所以废除掉这些方法,主要的原因是因为这些方法有可能导致线程的死锁,所以从jdk1.2开始就都不建议使用了,那现在我要停止线程需要怎么做呢?

凡是强制性停止的就会导致线程死锁

后台守护线程

  现在假设有一个人,这个人有一个保镖,那么这个保镖一定是在这个人活着的时候进行守护,一旦这个人死了,保镖就没用了。所以在多线程里面可以进行守护线程的定义,也就是说如果现在主线程的程序或者其它的线程还在执行的时候,那么守护线程将一直存在,并且运行在后台状态。

  在Thread类里面提供有如下的守护线程的操作方法:

  可以发现所有的守护线程都是围绕在用户线程的周围,如果程序执行完毕了,守护线程也就消失了,在整个JVM里面最大的守护线程就是GC线程。

  程序执行中GC线程会一直存在,如果程序执行完毕,GC线程也将消失

volatile关键字

   在多线程的定义之中,volatile关键字主要是在熟悉定义上使用的,表示此属性为直接数据操作,而不进行副本的拷贝处理。这样在一些书上就将其错误的理解为同步属性了。

而如果一个属性上追加了volatile关键字,表示的就是不使用副本,而是直接操作员是变量,相当于节约了:拷贝副本、重新保存的步骤

volatile可以更快的进行变量的修改处理。

面试题:请解释volatile与synchronized的区别?

  volatile主要在属性上使用,而synchronized是在代码块与方法上使用的;

  volatile无法描述同步的处理,它只是一种直接内存的处理,避免了副本的操作,而synchronized是实现同步的

原文地址:https://www.cnblogs.com/djlindex/p/11226511.html