Java|锁--JAVA成长之路( 八 )
接着是读锁的代码:
可以看到在tryAcquireShared(int unused)方法中 , 如果其他线程已经获取了写锁 , 则当前线程获取读锁失败 , 进入等待状态 。 如果当前线程获取了写锁或者写锁未被获取 , 则当前线程(线程安全 , 依靠CAS保证)增加读状态 , 成功获取读锁 。 读锁的每次释放(线程安全的 , 可能有多个读线程同时释放读锁)均减少读状态 , 减少的值是“1<<16” 。 所以读写锁才能实现读读的过程共享 , 而读写、写读、写写的过程互斥 。
此时 , 我们再回头看一下互斥锁ReentrantLock中公平锁和非公平锁的加锁源码:
我们发现在ReentrantLock虽然有公平锁和非公平锁两种 , 但是它们添加的都是独享锁 。 根据源码所示 , 当某一个线程调用lock方法获取锁时 , 如果同步资源没有被其他线程锁住 , 那么当前线程在使用CAS更新state成功后就会成功抢占该资源 。 而如果公共资源被占用且不是被当前线程占用 , 那么就会加锁失败 。 所以可以确定ReentrantLock无论读操作还是写操作 , 添加的锁都是都是独享锁 。
- Java|计算机专业的本科生,该选择学习Java技术体系还是.NET技术体系
- 小熊回收站|-链表阻塞队列和数组阻塞队列的异同,Java并发编程
- Java|马化腾登顶中国首富,微信、QQ却都免费使用,腾讯到底咋赚钱的?
- Java|为什么美团骑手总是闯红灯昵
- 育儿知识看这里|有福气?父母改变识知,帮助孩子健康成长,孩子胖
- 阿里巴巴|java三大集合遍历方法
- 编程|JAVA基础-网络编程
- Java|Java中的天使和魔鬼:Unsafe类
- Java|面试官:连多线程问题你都一问三不知,还要我怎么“放水”?
- Java|Java--死锁详解