自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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关注的人

提示
确定要删除当前文章?
取消 删除