6

作者: 啊啊啊啊啊恩 | 来源:发表于2017-12-21 16:51 被阅读0次

    Java内存模型定义了Java语言中的synchronized、volatile和final等关键词对主存中变量读写操作的意义。Java开发人员使用这些关键词来描述程序所期望的行为,而编译器和JVM负责保证生成的代码在运行时刻的行为符合内存模型的描述。比如对声明为volatile的变量来说,在读取之前,JVM会确保CPU中缓存的值首先会失效,重新从主存中进行读取;而写入之后,新的值会被马上写入到主存中。而synchronized和volatile关键词也会对编译器优化时候的代码重排带来额外的限制。比如编译器不能把synchronized块中的代码移出来。对volatile变量的读写操作是不能与其它读写操作一块重新排列的。

    [if !supportLists]1.1[endif]线程中断方法

    通过一个线程对象的interrupt()方法可以向该线程发出一个中断请求。中断请求是一种线程之间的协作方式。当线程A通过调用线程B的interrupt()方法来发出中断请求的时候,线程A是在请求线程B的注意。线程B应该在方便的时候来处理这个中断请求,当然这不是必须的。

    当中断发生的时候,线程对象中会有一个标记来记录当前的中断状态。通过isInterrupted()方法可以判断是否有中断请求发生。如果当中断请求发生的时候,线程正处于阻塞状态,那么这个中断请求会导致该线程退出阻塞状态。

    可能造成线程处于阻塞状态的情况有:

    [if !supportLists]l[endif]当线程通过调用wait()方法进入一个对象的等待集合中

    [if !supportLists]l[endif]通过sleep()方法来暂时休眠

    [if !supportLists]l[endif]通过join()方法来等待另外一个线程完成的时候

    在线程阻塞的情况下,当中断发生的时候,会抛出java.lang.InterruptedException,代码会进入相应的异常处理逻辑之中。实际上在调用wait/sleep/join方法的时候,是必须捕获这个异常的。

    中断一个正在某个对象的等待集合中的线程,会使得这个线程从等待集合中被移除,使得它可以在再次获得锁之后,继续执行java.lang.InterruptedException异常的处理逻辑。

    通过中断线程可以实现可取消的任务。在任务的执行过程中可以定期检查当前线程的中断标记,如果线程收到了中断请求,那么就可以终止这个任务的执行。

    当遇到java.lang.InterruptedException的异常,不要捕获了之后不做任何处理。如果不想在这个层次上处理这个异常,就把异常重新抛出。当一个在阻塞状态的线程被中断并且抛出java.lang.InterruptedException异常的时候,其对象中的中断状态标记会被清空。如果捕获了java.lang.InterruptedException异常但是又不能重新抛出的话,需要通过再次调用interrupt()方法来重新设置这个标记。

    相关文章

      网友评论

          本文标题:6

          本文链接:https://www.haomeiwen.com/subject/bdbawxtx.html