ReentrantReadWriteLock_读写锁

╰+攻爆jí腚メ 2023-07-23 03:46 71阅读 0赞

   读写锁的核心是实现读与写的分离,在高并发的情况下,尤其是读多写少的情况下,性能要远高于重入锁.对于Synchronize,ReentrantLock时,同一个时间内,只能由一个线程进行访问被锁定的代码,而读写锁则不同,其本质是分成两个锁,即读锁和写锁. 在读锁下,多个线程可以并发的进行访问,但是在写锁的时候,只能一个个的顺序访问.
   读读共享,写写互斥,读写互斥
一、读写锁代码示例

  1. public class UseReentrantReadWriteLock {
  2. private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
  3. private ReadLock readLock = rwLock.readLock();
  4. private WriteLock writeLock = rwLock.writeLock();
  5. public void read(){
  6. try {
  7. readLock.lock();
  8. System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");
  9. Thread.sleep(3000);
  10. System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. } finally {
  14. readLock.unlock();
  15. }
  16. }
  17. public void write(){
  18. try {
  19. writeLock.lock();
  20. System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");
  21. Thread.sleep(3000);
  22. System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. } finally {
  26. writeLock.unlock();
  27. }
  28. }
  29. public static void main(String[] args) {
  30. final UseReentrantReadWriteLock urrw = new UseReentrantReadWriteLock();
  31. Thread t1 = new Thread(new Runnable() {
  32. @Override
  33. public void run() {
  34. urrw.read();
  35. }
  36. }, "t1");
  37. Thread t2 = new Thread(new Runnable() {
  38. @Override
  39. public void run() {
  40. urrw.read();
  41. }
  42. }, "t2");
  43. Thread t3 = new Thread(new Runnable() {
  44. @Override
  45. public void run() {
  46. urrw.write();
  47. }
  48. }, "t3");
  49. Thread t4 = new Thread(new Runnable() {
  50. @Override
  51. public void run() {
  52. urrw.write();
  53. }
  54. }, "t4");
  55. // t1.start();
  56. // t2.start();
  57. // t1.start(); // R
  58. // t3.start(); // W
  59. t3.start();
  60. t4.start();
  61. }
  62. }

一、锁的优化

   1.避免死锁
   2.减少锁的持有时间
   3.减少锁的粒度
   4.锁的分离
   5.尽量使用无锁的操作,如:原子操作(Automic系列类),volatile关键字

发表评论

表情:
评论列表 (有 0 条评论,71人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ReentrantReadWriteLock

    1. 写锁比读锁的优先级要高,拥有写锁之后还可以再获取读锁,但是拥有读锁的线程在释放前无法再获取写锁。 2. 允许锁降级,即从写锁降级为读锁,实现的步骤是:先获取写锁,再获