zoukankan      html  css  js  c++  java
  • Static block start new thread

    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()。

  • 相关阅读:
    在zend framework框架中try{}catch(Exception e){}的跳转问题
    【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS
    iOS 图像处理-剪裁图像
    Delphi DBGrid记录全选和反选拖动处理
    在DbGrid中,不按下Ctrl,单击鼠标如何实现多选?谢谢
    在DBGrid中实现多选功能
    回车跳到下一个EDIT
    远程控制篇:用Delphi模拟键盘输入/鼠标点击
    SQL的拼接语句在DELPHI中怎么写
    Delphi DbGridEh实现表格没有内容的渐变效果
  • 原文地址:https://www.cnblogs.com/riskyer/p/3253688.html
Copyright © 2011-2022 走看看