- 博客(10)
- 收藏
- 关注
原创 第七十八条 虑用序列化代理代理序列化实例
实现了序列化的类,在序列化和反序列化时,由 writeObject 方法把对象写入磁盘,实例的创建是由readObject方法来完成的,因此,每次反序列化出来的对象的地址值都不一样,为了解决这个问题,可以编写 readResolve() 方法,或者用枚举代替实例类。有没有其他的办法呢?我们知道,执行 readObject 时,外部可能会通过伪字节流和内部盗用域来攻击程序,它就是伪造一个字节流,通...
2018-12-29 11:27:01 249
原创 第七十七条 对于实例控制,枚举类型优于readResolve
我们应该知道一点, readResolve() 方法,会在 readObject() 之后被调用,readResolve() 的返回值将会代替 readObject() 中反序列化的对象, readObject() 中反序列化的对象会被丢弃。我们知道,readObject() 会单独开启一个构造器,会打破一些东西。例如单利 public final class MySingleton ...
2018-12-28 16:13:36 257
原创 第七十六条 保护性编写readObject方法
书中本条目开头给了一个代码例子。 public final class Period implements Serializable { private final Date start; private final Date end; public Period(Date start, Date end) { this.start = new ...
2018-12-25 12:48:35 575
原创 第七十五条 考虑使用自定义的序列化形式
序列化使用起来比价方便,但有一些常见的细节需要注意,比如说定义 serialVersionUID 值,关键字 transient 的用法,下面就用例子来说明 定义一个bean,实现序列化的接口, public class Student implements Serializable { int age; String address; public Student...
2018-12-24 14:42:44 260
原创 第七十四条 谨慎地实现 serizable 接口
我们把 String 或 八大基本类型的值保存在内存,或保存到本地file文件夹里,或通过网络传给服务端,比较容易;但我们自定义的 class 对象怎么办,他们直接保存到本地,保存不了他们的属性的值,比如 class Student 对象,里面 age 和 address 两个属性;有个对象 student,age 为 13,address 为 北京,我们想把student 的值直接保存到数据库...
2018-12-20 21:38:16 632
原创 第七十三条 避免使用线程组
除了线程、锁、监视器外,系统还提供了一个基本的抽象,即线程组。线程组的目的是作为一种隔离的机制,但实际上却没达到这个目的。因为线程组 ThreadGroup 表示一组线程的集合,一旦这个线程归属到一个线程组之中后,这个线程就不能再更换其所在的线程组。这种就是把一条线程卡死在一个线程组中了,并非是隔离。但线程组有个好处:线程组可以进行复制,统一进行异常处理设置等。但是从线程安全性的角度来看,Thre...
2018-12-15 14:07:45 379 1
原创 第七十二条 不要依赖于线程调度器
当有多个线程可以运行时,由线程调度器决定哪些线程将会运行,以及运行多长时间。任何一个合理的操作系统在做出这样的决定时,都会努力做到公正,但是所采用的策略却相差无几。因此,编写良好的程序不应该依赖于这种策略的细节。任何依赖于线程调度器来达到正确性或者性能要求的程序,很有可能都是不可移植的。我们一般是需要把功能单独模块化,保持独立,超级解耦,随时都能被拎出来,被其他项目复用。 要编写健壮的、响应良好...
2018-12-10 20:56:53 443
原创 第七十一条 慎用延迟初始化
延迟初始化是延迟到需要域的值时才将它初始化的这种行为。如果永远不需要这个值,那么这个域就永远不会被初始化,这种方法既适用于静态域,也适用于实例域。延迟初始化主要是一种优化方式。 就像大多数的优化一样,对于延迟初始化,最好建议“除非绝对必要,否则就不要这么做”。延迟初始化就像一把双刃剑。它降低了初始化类或者创建实例的开销,却增加了访问被延迟初始化的域的开销。根据延迟初始化的域最终需要初始化的比例、...
2018-12-07 11:50:37 415
原创 第七十条 线程安全性的文档化
当一个类的方法或静态方法被并发使用的时候,很可能会造成线程安全隐患。如果你没有在一个类的文档中描述其行为的并发性情况,使用这个类的其他人将不得不做出某些demo来验证它是否并发安全,可能缺少足够的同步,或者过度同步,无论属于这其中的哪种情况,都可能会发生严重的错误。我们可能听过这样的说法:通过查看文档中是否出现synchronized修饰符,可以确定一个方法是否是线程安全的。这种说法是错误的,在正...
2018-12-05 16:13:06 795
原创 第六十九条 并发工具优先于wait和notify
java中经常会用到子线程等,当各个线程作操作后,需要处理数据,我们需要自己重写wait和notify方法,但1.5以后,java平台对这些要求提高了,我们可以用高级的工具来代替。比如用线程池管理线程,或者java提供的并发集合类以及同步器(Synchronizer)。线程池上一条介绍过了。并发集合Concurrent Collection,它的标准接口如 List Queue Map等,为了提供...
2018-12-03 17:02:17 317
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人