读写锁(ReadWriteLock)
程序员文章站
2022-06-29 14:05:06
为了提高性能,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 }