Static block start new thread

本文通过一个具体的Java示例程序展示了静态初始化过程中可能遇到的线程死锁问题。详细分析了程序运行流程及死锁产生的原因,并探讨了解决此类问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值