摘抄
《Thinking in Java》
- Java尽力保证:所有变量在使用前都能得到恰当的初始化。P91
类的每个基本类型数据成员保证都会有一个初始值,若在IDE初始化数据时未指定初始值,IDE报错,原因是IDE设计理念是不想让程序员忽视自己的工作缺失。
疑问
- Java中禁止使用全局方法。
是否因为static的main方法的存在?Java中不能出现静态内部类,所以无法写出一套包含main方法在内的全局方法? - Illegal forward reference
向前引用 的疑问 P93 - 多线程环境?Java中为什么说多线程环境就不安全?
你是一个流浪汉,整天为饥饿发愁。有一天你发现了一个房间,这个房间里有很多食物,你很开心,你去品尝食物。但是好景不长,很快又有很多流浪汉也发现了这里,他们也来这个房间去吃食物,你不能阻挡他们。你很不爽,同时原来被整整齐齐摆放的食物,他们来了就狼吞虎咽,食物被整的乱七八糟。
上面这个例子就是一个由单线程到多线程的问题,你一个人就是单线程,食物就是数据,你一个人可以处理数据,处理完了它就是那样,不可能由其他的线程来修改数据。但是一旦到多线程环境(很多流浪汉),多线程同样有操作数据的权力,他们可以任意修改数据,这样数据就可能被修改很多次,从而发生脏数据(食物乱七八糟),这样的数据就是不安全的,返回给前台用就有可能发生错乱,出来的结果与业务逻辑不符。
怎么避免这个问题呢,也就是解决多线程问题,可以定义一个锁,加上synchronize关键字,锁住一个代码块,这样就算有很多人去抢同一个资源,有锁的话,一个人进去,把门关上,锁住,其他人就进不来了。这个人消耗了资源,然后再出来,下一个再进去。这样就避免哄抢的问题。还有更有效的方式是使用线程池,可以有效解决线程安全问题。 - 为什么第5行处的方法名前都必须加上类名?
public class Singleton4 {
// 私有构造
private Singleton4() {}
private static Singleton4 single = null;
// 双重检查
public static Singleton4 getInstance() {
if (single == null) {
synchronized (Singleton4.class) {
if (single == null) {
single = new Singleton4();
}
}
}
return single;
}
}