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 }