Static block start new thread

public class StaticThreadInit {

static{

Threadt = newThread(){

public void run(){

System.out.println("run");

System.out.println(webSite);

webSite = "test1";

System.out.println("exitrun");

}

};

t.start();

try{

t.join();

}catch(Exception ex){

ex.printStackTrace();

}

}

static String webSite = "test0";

public static void main(String[] args){

System.out.println(StaticThreadInit.webSite);

}

}

Output:

run

程序总是从main方法开始执行,main方法只有一行代码,访问StaticThreadInit类的website静态field的值。当某个线程试图访问一个类的静态field时,根据该类的状态可能出现如下4种情况:

该类尚未被初始化;当前线程开始对其执行初始化。

该类正在被当前线程执行初始化:这是对初始化的递归请求。

该类正在被其他线程执行初始化:当前线程暂停,等待其他线程初始化完成。

这个类已经被初始化:直接得到该静态field的值。

Main线程试图访问StaticThreadInit.website的值,此时StaticThreadInit尚未被初始化,因此main线程开始对该类执行初始化。初始化过程主要完成如下两个步骤:

为该类所有静态field分配内存;

调用静态初始化块的代码执行初始化。

因此,main线程首先会为StaticThreadInit类的website field分配内存空间,此时的website的值为null。接着,main线程开始执行StaticThreadInit类的静态初始化块。该代码创建并启动了一条新线程,并调用了新线程的join()方法,这意味着main线程必须等待新线程执行结束后才能向下执行。

新线程开始执行之后,首先执行System.out.println("run");代码,接着,试图执行System.out.println(webSite);问题出现了,StaticThreadInit类正由main线程执行初始化,因此新线程会等待main线程对StaticThreadInit类执行初始化结束。

这时候满足死锁条件:两个线程互相等待对方执行,因此都不能向下执行。因此程序执行到此处就出现了死锁。

上面程序的死锁原因在于调用了t.join()。

最新文章

  1. Lind.DDD.LindAspects方法拦截的介绍
  2. NodeJs 开发微信公众号(四)微信网页授权
  3. UIColor+Hex
  4. SCRUM项目 5.0
  5. 剑指offer题目11-20
  6. Java SE ---数据类型
  7. RPI-Wireless-Hotspot
  8. How to detect and avoid memory and resources leaks in .NET applications
  9. Delphi一共封装(超类化)了8种Windows基础控件和17种复杂控件
  10. ios开发使用lipo命令合并真机库和模拟器库
  11. Oracle新建用户赋只读某几张表的权限
  12. HTML 表单和输入
  13. Oculus关于Internal Error:OVR53225466报错解决方法
  14. 【强连通分量】Bzoj1194 HNOI2006 潘多拉的盒子
  15. RxJava2学习笔记(2)
  16. 1、 LwIP协议栈规范翻译——简介
  17. Week3_代码复审
  18. OSI互联数据包封装与解封装过程
  19. 2017-2018-1 JaWorld 第六、七周作业
  20. 2017 济南综合班 Day 3

热门文章

  1. java文本编辑器5
  2. C++设计模式之命令模式
  3. 压缩OLEVARIANT数据
  4. oracle字符集查看修改
  5. svn 问题汇总
  6. 君子性非异也,善假于物也 - Threejs 引入TrackballControls 查看场景
  7. 引入css ,使用@import和link的方式
  8. Kettle 连接失败 Oracle 数据库报 ora-12505 的解决方法(转)
  9. SlidingMenu的编译及使用
  10. cron 定时任务