1、终结函数守卫者
* 通过终结函数守卫者,我们能够保证在外部类对象被回收之前的外部类对象的终结函数的调用
* 应外匿名类的对象的生命周期和Foo相同,而且在回收时先被回收,就守卫了终结函数的调用
* 能够防止忘记或者恶意的不调用终结函数
2、final 变量只能在声明时初始化或者在构造方法中初始化
3、Junit中每次的运行测试案例,将会运行该案例中所有的测试方法。
4、因为HashMap使用Hash桶来放置对象,理想的情况每个Hash桶只有一个对象,但是一般而言很难,甚至可以形成具有相同的HashCode的链表
5、volatile 保证任何一个线程在读取一个域的时候都将会看到最近刚刚被写入的值。
简单的说volatile提供synchronized的可见性,而不提供互斥性。
* 我想volatile,是这用关键字volatile修饰过的变量,放在主内存中而不是线程的工作内存
* 这样每次当该变量的值改变的时候,就会在主内存中改变。
* 而一般的变量,将会在线程的工作内存中保持一份拷贝,然后只在适当的时机,才会将变化写入到主内存
* 对于同步块而言,这个时机就是同步块开始或结束,而其它的时机,我想是在当前使用该变量语句后。
* 当然volatile变量不保证原子性(也就是volatile变量的使用,可能被其它的线程干扰,比如两个线程同时对该变量操作,但是要在高压的情况下才能出现,要实现原子性必须对该变量加锁。),仅保证可见性(总是得到最新修改的值)。
6、计算机无法进行正确的浮点运算,因为计算机是二进制的,我们在 Java 中可以使用BigDecimal、int或者long进行浮点运算,这样可以得到准确的结果。
7、不要使用字符串连接操作符来连接字符串,除非性能无关紧要,否则使用StringBuffer中的append方法,或者使用更好的StringBuilder。
(通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快)。
8、添加join后当前线程必须要等待该线程结束后在执行,也就是将该线程加入到当前线程运行周期之内
9、如果不想被恶意攻击,请使用私有的对象监视器。永远不要使用线程组ThreadGroup。
10、serialVersionUID 表示一个可序列化的类的版本信息,我们应该总是提供一个手动的serialVersionUID,而不是由系统自动生成。这样可以保证
类的兼容性和节省略微的性能开销。
11、应该总是实现自定义的序列化,除非一个对象的物理结构和逻辑结构式一样的,即使是这样我们最好也用自定义的序列化,提供一个readObject方法来
保证约束关系和安全性。
12、为了实现序列化的Singleton,那么我们应当提供一个readResolve方法。
13、从本质上来讲,readResolve方法将readObject从事实上的公有构造函数变成事实上的公有静态工厂(针对于反序列化是产生的对象)。