当多个线程同时对一个类的属性进行读写操作时,往往会涉及到多线程之间的通信问题。
如果是多线程同时(写写)或者多线程同时(读写),往往希望线程之间是“互斥的”,也就是当其中一个线程访问该类的一个熟悉时(不管是读还是写)都需要对该读写方法进行加锁,以免其他线程在此期间争抢该读写方法导致多线程访问的数据有误。
以上的情况不可避免的带来效率的下降,那么我们现在来考虑下面这种情况,如果是多线程同时进行读,这种情况是允许他们同时访问的,效率会提高。
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 @Override14 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 @Override23 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 //read36 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 //write47 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 }