谜题76:乒乓public class PingPong {
public static void main(String[] args) {
Thread t = new Thread(){
public void run(){
pong();
}
};
t.run();
System.out.println("Ping");
}
static synchronized void pong(){
System.out.println("Pong");
}
}
在多线程程序中,通常正确的观点是程序每次运行的结果都有可能发生变化,但是上面这段程序总是打印出相同的内容。在一个同步化的静态方法执行之前,它会获取与它的class对象相关的一个管程(monitor)锁。在上面程序中,主线程会在创建第二个线程之前获得与PingPong.class相关联的那个锁。只有主线程占着这个锁,第二个线程就不可能执行同步化的静态方法。具体讲,在main方法打印了Ping并且执行结束后,第二个线程才能执行pong方法。只有当主线程放弃那个锁的时候,第二个线程才能允许获得这个锁并且打印pong。根据分析,结果应该打印出PingPong,但结果是PongPing。为甚?
这段程序并不是一个多线程程序。它确实是创建了第二个线程,但是它从未启动这个线程。相反地,主线程会调用那个新的线程实例的run方法,这个方法与主线程同步地运行。
只需将t.run();改为t.start()来启动线程。
public class Main95 {
public static void main(String[] args) {
int count = 0;
for(int i =0;i<100;i++);{
count++;
}
System.out.println(count);
}
}
打印1,因为;的缘故
下面是一个反射的例子会打印出什么呢?
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
public class Ref {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Set<String> s = new HashSet<String>();
s.add("foo");
Iterator it = s.iterator();
Method m = it.getClass().getMethod("hasNext");
System.out.println(m.invoke(it));
}
}
Exception in thread "main" java.lang.IllegalAccessException: Class chapter9.Ref can not access a member of class java.util.HashMap$HashIterator with modifiers "public final"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
hasNext方法是公共的。
这个类型是由从it.getClass()方法返回的Class对象表示的。这时迭代器的动态类型,它恰好是私有的嵌套类java.util.HashMap.KeyIterator。出现这种异常,就是因为该类不是公共的。
访问位于其他包中的非公共类型的成员是不合法的。
分享到:
相关推荐
java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题 java 高级谜题 ......
我整理出来的Java解惑/谜题的CHM版本,包括目录、全文搜索和收藏夹。比目前Word/PDF版本的多个目录,比TXT版本的多一些格式。-- 如果不能打开CHM,请按下面方法解决:-- 右键点击chm文档,查看属性,可以看到...
java解惑(java谜题)中文版的. 值得一看的JAVA资料. Java puzzlers
Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...
java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑
在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、...
谜题76:乒乓 谜题77:搞乱锁的妖怪 谜题78:反射的污染 谜题79:这是狗的生活 谜题80:更深层的反射 谜题81:烧焦(字符化)到无法识别 谜题82:啤酒爆炸 谜题83:诵读困难者的一神论 谜题84:被粗暴地中断...
该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
95个谜题,即95个java开发者常见错误,经常混淆的地方,希望对大家有所帮助,这个pdf文档超清晰
本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
Java谜题—对java的95个谜题进行讲解
java解惑,揭示了上百个程序容易犯错且理解不清楚的问题
java谜题解惑This Fifth Edition is completely revised and expanded to cover JavaScript as it is used in today's Web 2.0 applications. This book is both an example-driven programmer's guide and a keep-...
Java Puzzlers 中文版(Java解惑) Java 谜题 1——表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转 吗? public static boolean isOdd(int i){ return i % 2 == 1...
Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...
Java谜题1——表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗? public static boolean isOdd(int i){ return i % 2 == 1; } 奇数可以被定义为被2整除余数为...
JAVA解惑_布洛赫.扫描版.(无保护,可修改) 《Java解惑》是由Joshua Bloch(美)、Neal Gafter(美)编著,陈昊鹏翻译的计算机语言类丛书,该书由人民邮电出版社2006年发行出版。该书特写了95个有关Java或其类库的陷阱和...
Java 谜题 谜题 20:我的类是什么? 下面的程序被设计用来打印它的类文件的名称。如果你不熟悉类字面常量,那么 我告诉你 Me.class.getName()将返回 Me 类完整的名称,即 “com.javapuzzlers.Me”。那么,这个程序...
Java 谜题解惑。如:奇数性、找零时刻、长整除、十六进制等相关疑惑。
java谜题解惑 解决谜题最佳方案