java中读锁的作用,为啥要用读锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中读锁的作用,为啥要用读锁相关的知识,希望对你有一定的参考价值。

读写锁:ReentrantReadWriteLock
如果有很多线程从一个数据结构中读取数据,而很少的线程修改数据,那么就用读写锁。

分别得到读锁和写锁:
ReentrantReadWriteLock rrwl=new ReentrantReadWriteLock();
ReadLock readL = rrwl.readLock();
WriteLock writeL = rrwl.writeLock();

读锁与读锁不互斥,读锁与写锁互斥,写锁与写锁互斥。
用于优化性能,提高读写速度。
参考技术A 多个线程准备进入临界区时,加读锁不会阻塞,此时线程都能够进入临界区。 参考技术B 锁是在多线程中引用的 参考技术C 防止多线程时数据被脏读!

读写锁(ReadWriteLock)

  为了提高性能,Java提供了读写锁,读写锁分为读锁和写锁。多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,这是由JVM控制的。如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率。

读锁

  如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁。

写锁

  如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁。

Java中读写锁有个接口,java.util.concurrent.locks.ReadWriteLock,也有具体的实现ReentrantReadWriteLock。

代码示例:

 1 public class TestReadWriteLock {
 2     public static void main(String[] args) {
 3         ReadWriteLockDemo rw = new ReadWriteLockDemo();        
 4         new Thread(new Runnable() {            
 5             public void run() {
 6                 rw.set((int)(Math.random() * 101));
 7             }
 8         }, "Write:").start();
 9         for (int i = 0; i < 100; i++) {
10             new Thread(new Runnable() {
11                 public void run() {
12                     rw.get();
13                 }
14             }).start();
15         }
16     }
17 }
18 class ReadWriteLockDemo{
19     private int number = 0;
20     private ReadWriteLock lock = new ReentrantReadWriteLock();
21     //
22     public void get(){
23         lock.readLock().lock(); //上锁
24         try{
25             System.out.println(Thread.currentThread().getName() + " : " + number);
26         }finally{
27             lock.readLock().unlock(); //释放锁
28         }
29     }
30     //
31     public void set(int number){
32         lock.writeLock().lock();
33         try{
34             System.out.println(Thread.currentThread().getName());
35             this.number = number;
36         }finally{
37             lock.writeLock().unlock();
38         }
39     }
40 }

以上是关于java中读锁的作用,为啥要用读锁的主要内容,如果未能解决你的问题,请参考以下文章

读锁跟写锁的区别

java中ReentrantReadWriteLock读写锁的使用

holmMySQL锁机制

holmMySQL锁机制

锁--02---锁的分类1----读锁(S锁)写锁(X锁)

Java的锁:公平锁,非公平锁,可重入锁,自旋锁,独占锁(写锁) / 共享锁(读锁) / 互斥锁...