欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

读写锁(ReadWriteLock)

程序员文章站 2023-11-14 09:23:16
为了提高性能,Java提供了读写锁,读写锁分为读锁和写锁。多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,这是由JVM控制的。如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率。 读锁 如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁。 写锁 如果你的代码修改数据, ......

  为了提高性能,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 }