Alice52 / java-ocean

java-tutorial .We intend to explain Java knowledge in this repository.
MIT License
0 stars 0 forks source link

[lock] common lock #125

Open Alice52 opened 4 years ago

Alice52 commented 4 years ago

锁的用法一般是这样的

  1. 只有在并发环境中,共享资源不支持并发访问,或者说并发访问共享资源会导致系统错误的情况下,才需要使用锁。
    • 如果能不用锁,就不用锁;如果你不确定是不是应该用锁,那也不要用锁
  2. 在访问共享资源之前,先获取锁。
  3. 如果获取锁成功,就可以访问共享资源了。
  4. 最后,需要释放锁,以便其他线程继续访问共享资源。

关于避免死锁,我在这里给你几点建议

  1. 尽量使用可重入锁
  2. 再次强调一下,避免滥用锁,程序里用的锁少,写出死锁 Bug 的几率自然就低。
  3. 对于同一把锁,加锁和解锁必须要放在同一个方法中,这样一次加锁对应一次解锁,代码清晰简单,便于分析问题。
  4. 尽量避免在持有一把锁的情况下,去获取另外一把锁,就是要尽量避免同时持有多把锁。
  5. 如果需要持有多把锁,一定要注意加解锁的顺序,解锁的顺序要和加锁顺序相反。比如,获取三把锁的顺序是 A、B、C,释放锁的顺序必须是 C、B、A。
  6. 给你程序中所有的锁排一个顺序,在所有需要加锁的地方,按照同样的顺序加解锁。比如我刚刚举的那个例子,如果两个线程都按照先获取 lockA 再获取 lockB 的顺序加锁,就不会产生死锁。

common

  1. 使用读写锁就兼顾了性能和安全
    • 读访问可以并发执行。
    • 写的同时不能并发读,也不能并发写。