JUC包中多线程之读写锁

当多个线程同时对一个类的属性进行读写操作时,往往会涉及到多线程之间的通信问题。

如果是多线程同时(写写)或者多线程同时(读写),往往希望线程之间是“互斥的”,也就是当其中一个线程访问该类的一个熟悉时(不管是读还是写)都需要对该读写方法进行加锁,以免其他线程在此期间争抢该读写方法导致多线程访问的数据有误。

以上的情况不可避免的带来效率的下降,那么我们现在来考虑下面这种情况,如果是多线程同时进行读,这种情况是允许他们同时访问的,效率会提高。

jdk1.5之后提供了Java.util.concurrent包,其中提供了ReadWriteLock这个接口,提供了ReentrantReadWriteLock的实现类,内部有readlock和writelock两个方法,用于实现单独对读写锁进行区别,这个避免了Lock类的加锁方法对读的方法单独占用。

 1 package xianchengtest;
 2 
 3 import java.util.concurrent.locks.ReadWriteLock;
 4 import java.util.concurrent.locks.ReentrantReadWriteLock;
 5 
 6 public class TestReadWriteLock {
 7 
 8     public static void main(String[] args) {
 9         ReadWriteLockDemo rw = new ReadWriteLockDemo();
10         //一个写线程
11         new Thread(new Runnable() {
12             
13             @Override
14             public void run() {
15                 rw.set((int)(Math.random() * 101));
16             }
17         },"Write").start();
18         //多个读线程
19         for (int i = 0; i < 100; i++) {
20             
21             new Thread(new Runnable() {
22                 @Override
23                 public void run() {
24                     rw.get();
25                 }
26             },"Read").start();
27         }
28     }
29 }
30 
31 class ReadWriteLockDemo {
32     private int number= 0;
33     private ReadWriteLock lock = new ReentrantReadWriteLock();
34     
35     //read
36     public void get() {
37         lock.readLock().lock();
38         try {
39             
40             System.out.println(Thread.currentThread().getName()+ " : " + number);
41         } finally {
42             lock.readLock().unlock();
43         }
44     }
45     
46     //write
47     public void set(int number) {
48         lock.writeLock().lock();
49         try {
50             System.out.println(Thread.currentThread().getName());
51             this.number = number;
52         } finally {
53             lock.writeLock().unlock();
54         }
55     }
56 }

 

posted on 2019-07-03 15:41  大猫食小鱼  阅读(239)  评论(0编辑  收藏  举报