Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[lock] common lock #125

Open
Alice52 opened this issue Jul 1, 2020 · 0 comments
Open

[lock] common lock #125

Alice52 opened this issue Jul 1, 2020 · 0 comments
Assignees

Comments

@Alice52
Copy link
Owner

Alice52 commented Jul 1, 2020

锁的用法一般是这样的

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

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

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

common

  1. 使用读写锁就兼顾了性能和安全
    • 读访问可以并发执行。
    • 写的同时不能并发读,也不能并发写。
@Alice52 Alice52 self-assigned this Jul 1, 2020
@Alice52 Alice52 added Doing and removed TODO labels Oct 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant