《Java 并发编程实战》学习笔记 Day5

73 阅读1分钟

1 如何用一把锁保护多个资源?

受保护资源和锁之间合理的关联关系应该是 N:1 的关系。不能用可变对象做锁。

1.1 保护没有关联关系的多个资源

例如,银行业务中有针对账户余额(余额是一种资源)的取款操作,也有针对账户密码(密码也是一种资源)的更改操作,我们可以为账户余额和账户密码分配不同的锁来解决并发问题。当然也可以用一把互斥锁来保护多个资源,例如我们可以只用 this 这一把锁来管理账户类里所有的资源就可以了。但是用一把锁有个问题,就是性能太差。

用不同的锁对受保护资源进行精细化管理,能够提升性能。这种锁还有个名字,叫细粒度锁。

1.2 保护有关联关系的多个资源

锁能覆盖所有受保护资源

  1. 可以创建一个 private 的带 Object lock 参数的构造函数,创建对象时,传入相同的 lock,这样所有的对象都会共享这个 lock 了。
  2. 就是用 class 作为共享的锁。class 对象共享的,而且这个对象是 Java 虚拟机在加载类的时候创建的,所以我们不用担心它的唯一性。使用 class 作为共享的锁,我们就无需在创建对象时传入了,代码更简单。

参考