2017年11月26日
摘要: 调用该方法的线程进入等待状态,只有等待另外线程的通知或被中断才会返回。 注意:调用wait()方法之后,会释放对象锁。 阅读全文
posted @ 2017-11-26 21:56 飞奔的菜鸟 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 中断操作是一种简便的线程间交互的方式,这种交互方式最适合用来取消或者停止任务。除了中断外,还能利用一个boolean变量来控制是否需要停止并终止该线程。例如: 阅读全文
posted @ 2017-11-26 21:41 飞奔的菜鸟 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 在调用suspend()方法之后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易死锁。同样stop()方法在终结一个线程时不会保证线程的资源正确释放,通常是没有给予线程完成资源释放工作的机会,会导致程序可能工作在不确定状态下。 阅读全文
posted @ 2017-11-26 21:17 飞奔的菜鸟 阅读(324) 评论(0) 推荐(0) 编辑
  2017年11月25日
摘要: 许多方法声明抛出InterruptedException(例如Thread.sleep()),这些方法在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException,此时调用isInterrupted()方法将会返回f 阅读全文
posted @ 2017-11-25 16:31 飞奔的菜鸟 阅读(141) 评论(0) 推荐(0) 编辑
摘要: Daemon线程是一种支持型线程,主要被用作程序中后台调度以及支持性工作。就是说,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出,此时Java虚拟机中的所有Daemon线程都需要立即终止。可以通过调用Thread.setDaemon(true)将线程设为Daemon线程 阅读全文
posted @ 2017-11-25 15:09 飞奔的菜鸟 阅读(432) 评论(0) 推荐(0) 编辑
  2017年11月23日
摘要: 双重检查锁定的延时初始化: 双重检查锁定看起来似乎很完美,但这是一个错误的优化!执行程序读取到第5行instance不为空时,instance引用的对象可能还没有完成初始化。 程序第8行所做的操作如下: 1:分配对象的内存空间 2:初始化对象 3:设置instance指向刚分配的内存地址 步骤2和3 阅读全文
posted @ 2017-11-23 21:11 飞奔的菜鸟 阅读(367) 评论(0) 推荐(0) 编辑
摘要: intra-thread semantics 保证重排序不会改变单线程内的程序执行结果。 换句话说,intra-thread semantics 允许那些在单线程内,不会改变单线程程序执行结果的重排序。 阅读全文
posted @ 2017-11-23 20:41 飞奔的菜鸟 阅读(892) 评论(0) 推荐(1) 编辑
摘要: 对于final域,编译器和处理器要遵守两个重要的重排序规则: 1:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2:初次读一个包含final域的对象的引用,与随后初次都这个final域,这两个操作之间不能重排序。 对于引用类型。写f 阅读全文
posted @ 2017-11-23 19:55 飞奔的菜鸟 阅读(180) 评论(0) 推荐(0) 编辑
  2017年11月22日
摘要: 理解volatile特性的一个好方法是吧对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。 即使是64位的long型和double型变量,只要它是volatile变量,对这些变量的读/写就具有原子性。 如果是多个volatile操作或类似于volatile++这种复 阅读全文
posted @ 2017-11-22 22:58 飞奔的菜鸟 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 每次处理器和内存之间的数据传递都是通过一系列步骤来完成的,这一系列步骤称之为总线事务。 总线事务包括读事务和写事务。 阅读全文
posted @ 2017-11-22 20:53 飞奔的菜鸟 阅读(1058) 评论(0) 推荐(0) 编辑