t.run();main线程调用t的run方法,并没有创建新线程。
t.start();创建一个新的线程t,并执行。
表示正在被链接的Thread实例调用wait方法,因此会释放锁。
因此如果你需要某个对象的锁的完全控制,则必须确保没有其他线程访问。
HashSet<String>s = new HashSet<String>();
Iterator i = s.iterator();这里的i是HashMap.keyIterator类型的。但是因为这个类型是不同包中且非公共的,因此不能调用他的方法。
class HashSet{ private transient HashMap<E,Object> map; public Iterator<E> iterator() { } |
Class.newInstance()是调用一个空的构造器。
而非静态内部类调用空构造器时,会有一个隐藏的一个参数即外部类实例,因此外表看起来是空的内部类构造器并不是空构造器。
结论:避免使用反射实例化内部类。
System.out是一个PrintStream,因此带有缓冲区,但是可以自动刷新。
但是有一个方法例外!
write(int)是唯一一个在自动刷新功能开启的情况下不刷新PrintStream输出流的方法。
实现了io.serializable的类可以简单的通过writeObject和readObject复制对象,并生成一个新的对象。
如果一个类是Singleton,因此只能有一个对象,怎么能够解决这个问题使得通过writeObject和readObject后的对象还是其本身呢?
private Object readResolve(){
return **;
}
Thread.interrupted()方法后会清除当前线程的中断状态。
Thread.isInterrupted()则只是测试是否已经被中断。
当一个线程访问一个类的某个成员之前,都会去检查这个类是否已经被初始化。
多线程下类初始化有4种情况:
(1)这个类没被初始化。
(2)这个类被当前线程初始化。
(3)这个类被其他线程初始化。
(4)这个类已经被初始化。
当第三种情况下,如果B线程要访问A类的某个成员,则发现正在被C线程初始化,则会等待C线程初始化完毕,才会继续运行。
结论:要明确初始化顺序。