`
freish
  • 浏览: 82903 次
  • 性别: Icon_minigender_1
  • 来自: 摄影帝国
社区版块
存档分类
最新评论
文章列表
写在开头:此文基于hotspot1.7.0(build 1.7.0-b147),1.6及以前的版本与1.7的版本实现上差别很大。线程池的逻辑非常复杂,原因在于线程池是有状态的(不是狭隘的指RUNNING,SHUTDOWN这些状态,而是一个类的状态,可以理解成对象的共享字段),而为了保证可伸缩性与效率,很多地方在访问这些状态的时候都没有使用锁来保证互斥访问,而采用的是多次检测。这意味着会有很多竞态条件的出现,在分析某个方法的时候,要同时想到多线程间多个方法的交互,要考虑它们的交错执行。这里只分析核心重要的方法,其它方法相对简单,就不多言了。限于本人知识、眼界有限,对于一些代码逻辑的解释极可能 ...
自jdk1.5开始,Java开始提供ScheduledThreadPoolExecutor类来支持周期性任务的调度,在这之前,这些工作需要依靠Timer/TimerTask或者其它第三方工具来完成。但Timer有着不少缺陷,如Timer是单线程模式,调度多个周期性任务时,如果某个 ...
最近几周玩了下android,一如既往,先拿个计算器练手,支持android2.1   中间也碰到一些难点,比如EditText的输入问题啊,运算符后面不能再跟运算符等等,还好都找到解决方案了   后续将碰到的对我个人来说是难点以及解决方案的内容写一写,先贴些图,放个源码   图形展示      
机器上装了多个jdk,有时候ant要用jdk1.5,开发android的jdk又需要1.6,在PATH中配置通用的jre必然影响另外一个   于是找了下,将android开发的eclipse的jdk单独配置为1.6   只需右键eclipse快捷方式,在eclipse.exe添加以下红色字体内容即可(后面的路径根据自己jdk安装目录而定):   eclipse.exe -vm D:\program\java\jdk1.6.0_26\bin\javaw.exe

深入了解Thread#yield

    博客分类:
  • java
Thread#yield方法表示“暂停当前正在执行的线程对象,并执行其他线程”。在《The Java Language Specification, Third Edition》的17.9 Sleep and Yield 一节中是这样描述的:   Thread.sleep causes the currently executing thread to sleep (temporarily cease execution) for the specified duration, subject to the precision and accuracy of syst ...
如下粗心的代码     public class Visibility { private static boolean stop; public static void main(String[] args) throws Exception { new Thread(new Runnable(){ public void run() { int i = 0; while(!stop) { i++; } System.out.println("finish loop,i=" + i); ...

java bridge method

    博客分类:
  • java
java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题。   如下代码:   public class TestBridgeMethod { public static void main(String[] args) { P p = new S(); p.test(new Object()); } } class P<T> { public T test (T t){ return t; } } class S extends P<String> { @Override ...
  对于int的switch,jvm是用tableswitch和lookupswitch来实现的,jdk1.7 switch增加了对string的支持,那么底层是如何实现的呢?是否增加了新的指令或是否给某些指令增加了新的含义?     看这样一个程序:   public class Test { ...
当你明明put进了一对非null key-value进了HashMap,某个时候你再用这个key去取的时候却发现value为null,再次取的时候却又没问题,都知道是HashMap的非线程安全特性引起的,分析具体原因如下:   public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); // indexFor方法取得key在table数组中的索引,table数组中的元素是一个链表结构,遍历链表,取得对应key的value ...
  双重检查锁定在延迟初始化的单例模式中见得比较多(单例模式实现方式很多,这里为说明双重检查锁定问题,只选取这一种方式),先来看一个版本:   public class Singleton {     private static Singleton instance = null;     private Singleton(){}    
如以下程序   import javax.swing.*; public class Test extends JFrame { public Test() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(600, 600); setLocationByPlatform(true); setVisible(true); } public static void main(String[] args) { new Test(); } }   使用含有以下内容bat文件时:   ...
众所周知,java.io.InputStream是不可序列化的,但是如何序列化一个带有InputStream的类呢?可以通过将流转换成字节数组来实现,这里利用序列化的机制来实现。   在java.io.Serializable这个标记接口的API中有这样的描述:       在序列化和反序列化过程中需要特殊处理的类必须使用下列准确签名来实现特殊方法: private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.Objec ...
众所周知,jdk1.6中添加了对动态脚本的支持,可以在java中执行js脚本,如果要在jdk1.4,1.5下使用这个功能,可以使用http://www.mozilla.org/rhino/上提供的jar,jdk1.6将这个开源项目集成进了jdk(jsr_223)。   在浏览器中,js是解释执行的,在java中,javascript脚本自然没有了window,document等对象,但这不影响javascript的强大,可以解释执行,也可以编译执行,大大提高了效率,所谓编译,也就是把javascript脚本编译成java方法的字节码。   标题中的错误Encountered co ...
Global site tag (gtag.js) - Google Analytics