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()。
Static block start new thread的更多相关文章
- 在magento中定义static block
在magento中如何调用static block?(系统面板内CMS---->static block) 解答:若想在站点页面的某个地方放点静态的内容,比如广告,或者是促销信息之类的,这样的东 ...
- Static和static block(静态块)的用法
一.用法:是一个修饰符,用于修饰成员(成员变量 成员函数)被动态所共享 当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用. 类名.静态成员 二.static特点: 1 ...
- java static block
java 中 静态块的作用 (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在 ...
- CUDA 关于 BLOCK数目与Thread数目设置
GPU的计算核心是以一定数量的Streaming Processor(SP)组成的处理器阵列,NV称之为Texture Processing Clusters(TPC),每个TPC中又包含一定数量的S ...
- Java static block static constructor , static field
http://stackoverflow.com/questions/7121213/singleton-instantiation http://docs.oracle.com/javase/spe ...
- thread block grid
grid里面包含block,block里面包含thread grid里面所有的block都是同样大小的, 每个block最多可以有1024个thread. blockDim表示一个block里面th ...
- CUDA中block和thread的合理划分配置
CUDA并行编程的基本思路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行执行,每个网格(Grid)可以最多创建65535个线程块,每个线程块(Block)一般最多可以创建512个并行 ...
- java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合
1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...
- 多线程爬坑之路-Thread和Runable源码解析
多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...
随机推荐
- android应用程序的组成部分
android 应用程序的组成部分 activity 应用表示层,应用程序中每一个UI都是通过activity类或者多个扩展实现的.activity使用fragment和视图来布局和显示信息,以及响应 ...
- hdu 5724 Chess 博弈
题目链接 一个n行20列的棋盘. 每一行有若干个棋子. 两人轮流操作, 每人每次可以将一个棋子向右移动一个位置, 如果它右边有一个棋子, 就跳过这个棋子, 如果有若干个棋子, 就将这若干个都跳过. 但 ...
- 查看linux版本的三种常用方法
1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如: [root@3.5.5Biz-46 ~]# lsb_release -a LSB Version: 1.3 Dis ...
- rownum的使用-分页
rownum的使用-分页 oracle分页显示方法 一.使用rownum分页显示方式 方式1:SELECT * FROM (SELECT ROWNUM r, a.* FROM b$i_exch_in ...
- 当你还在争夺移动支付的时候,我已经统一了IC卡市场
摘要:虽然说今年移动支付行业的发展很快:苹果.Twitter和Facebook等巨头都开始进军这个市场,再加上PayPal.Coin和Square几个“老玩家”的存在,使得今年的移动支付市场热闹非凡. ...
- DbConnectionFactory 数据库连接
/** * */package com.sprucetec.dbatch.tmsfee;import java.io.Serializable;import java.sql.Connection;i ...
- mysql查询语句理解
看一个查询语句 ,)) as passcount FROM (SELECT b.user,b.full_name,b.user_group From login_log a LEFT JOIN vic ...
- 《UML和模式应用》重点之思想篇
本书是帮助开发人员和学生学习面向对象分析和设计(OOA/D)的核心技能的重要工具. UML不是OOA/D.也不是方法,仅仅是图形表示法,假设没有真正掌握怎样创建优秀的面向对象设计,或者怎样评估和改进现 ...
- Java中的图形界面编程
前言 正文 Java中的图形界面编程 AWT/Swing AWT(Abstract Window ToolKits,抽象窗体工具集) 1.容器类:用来存储组件,实现容器布局 2.组件类:实现界面的一些 ...
- Effective C++ Item 36 绝不又一次定义继承而来的 non-virtual 函数
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:绝对不要又一次定义继承而来的 non-virtual 函数 --> Item 7 ...