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

Static block start new thread的更多相关文章

  1. 在magento中定义static block

    在magento中如何调用static block?(系统面板内CMS---->static block) 解答:若想在站点页面的某个地方放点静态的内容,比如广告,或者是促销信息之类的,这样的东 ...

  2. Static和static block(静态块)的用法

    一.用法:是一个修饰符,用于修饰成员(成员变量 成员函数)被动态所共享 当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用. 类名.静态成员 二.static特点: 1 ...

  3. java static block

    java 中 静态块的作用 (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在 ...

  4. CUDA 关于 BLOCK数目与Thread数目设置

    GPU的计算核心是以一定数量的Streaming Processor(SP)组成的处理器阵列,NV称之为Texture Processing Clusters(TPC),每个TPC中又包含一定数量的S ...

  5. Java static block static constructor , static field

    http://stackoverflow.com/questions/7121213/singleton-instantiation http://docs.oracle.com/javase/spe ...

  6. thread block grid

    grid里面包含block,block里面包含thread grid里面所有的block都是同样大小的,  每个block最多可以有1024个thread. blockDim表示一个block里面th ...

  7. CUDA中block和thread的合理划分配置

    CUDA并行编程的基本思路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行执行,每个网格(Grid)可以最多创建65535个线程块,每个线程块(Block)一般最多可以创建512个并行 ...

  8. java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合

    1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...

  9. 多线程爬坑之路-Thread和Runable源码解析

    多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...

随机推荐

  1. hadoop 2.6.0 yarn total memory metrics 不正常

    https://issues.apache.org/jira/browse/YARN-3432

  2. Javascript的数组操作[转]

    1.shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); // 结果 a:[2,3,4 ...

  3. MySQL远程(IP)连接报错:Host 'IP地址' is not allowed to connect to this MySQL server

    ERROR 1130: Host ’192.168.1.3′ is not allowed to connect to this MySQL server这是告诉你没有权限连接指定IP的主机,下面我们 ...

  4. Scala类型声明与定义、函数定义、流程控制、异常处理

    Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库. Scala的基础类型基本与javascript一致. Scala的数据类型全部相同于Java中,具有 ...

  5. JPEG图像密写研究(一) JPEG图像文件结构

    [转载]转载自http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html JPEG压缩编码算法的主要计算步骤如下: (0) 8*8分块. ...

  6. myeclipse 环境配置优化,不断跟新整理中

    myeclipse 环境配置,不断跟新整理中1.General --->Workspace ---> UTF-8 工作环境编码2.General --->Editors --> ...

  7. 在windows下进行linux开发:利用Vagrant+virtualbox(ShowDoc与mp3dish的作者)

    1,介绍Vagrant 我们做web开发的时候经常要安装各种本地测试环境,比如apache,php,mysql,redis等等.出于个人使用习惯,可能我们还是比较习惯用windows.虽然说在wind ...

  8. Android消息机制不完全解析(下)

    接着上一篇文章Android消息机制不完全解析(上),接着看C++部分的实现. 首先,看看在/frameworks/base/core/jni/android_os_MessageQueue.cpp文 ...

  9. Unix/Linux环境C编程入门教程(8) FreeBSD CCPP开发环境搭建

    1. FreeBSD是一种自由类Unix操作系统,是由经过BSD.386BSD和4.4BSD发展而来的类Unix的一个重要分支.FreeBSD拥有超过200名活跃开发者和上千名贡献者.FreeBSD被 ...

  10. Cppcheck软件使用

    一款开源源码检测工具.简单易用. 官网网址:http://cppcheck.sourceforge.net/ 软件可直接官网下载. [plain] view plaincopy Features Ou ...