1 import java.util.Random; 2 import java.util.concurrent.locks.ReadWriteLock; 3 import java.util.concurrent.locks.ReentrantReadWriteLock; 4 /** 5 * 6 * @author LiTaiQing 7 * 8 */ 9 public class ReadWriteLockTest { 10 public static void main(String[] args){ 11 final Queue3 q3 = new Queue3(); 12 13 for (int i = 0; i < 3; i++) { 14 new Thread(){ 15 @Override 16 public void run(){ 17 while(true){ 18 q3.get(); 19 } 20 } 21 }.start(); 22 23 new Thread(){ 24 @Override 25 public void run() { 26 q3.put(new Random().nextInt(10000)); 27 }; 28 }.start(); 29 30 } 31 32 } 33 34 } 35 class Queue3{ 36 private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。 37 //读写锁-实现类ReentrantReadWriteLock 38 ReadWriteLock rwl = new ReentrantReadWriteLock(); 39 public void get(){ 40 rwl.readLock().lock(); 41 try { 42 System.out.println(Thread.currentThread().getName() + " be ready to read data!"); 43 Thread.sleep((long)(Math.random()*1000)); 44 System.out.println(Thread.currentThread().getName() + "have read data :" + data); 45 } catch (InterruptedException e) { 46 e.printStackTrace(); 47 }finally{ 48 rwl.readLock().unlock(); 49 } 50 } 51 public void put(Object data){ 52 rwl.writeLock().lock(); 53 try { 54 System.out.println(Thread.currentThread().getName() + " be ready to write data!"); 55 Thread.sleep((long)(Math.random()*1000)); 56 this.data = data; 57 System.out.println(Thread.currentThread().getName() + " have write data: " + data); 58 } catch (InterruptedException e) { 59 e.printStackTrace(); 60 }finally{ 61 rwl.writeLock().unlock(); 62 } 63 } 64 }
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.concurrent.locks.ReadWriteLock; 4 import java.util.concurrent.locks.ReentrantReadWriteLock; 5 /** 6 * 面试题,写一个缓存系统 7 * @author LiTaiQing 8 * 9 */ 10 public class CacheDemo { 11 12 private Map<String,Object> cache = new HashMap<String,Object>(); 13 14 public static void main(String[] args) { 15 16 } 17 /** 18 * 读写锁的应用 19 */ 20 private ReadWriteLock rwl = new ReentrantReadWriteLock(); 21 public Object getData(String key){ 22 rwl.readLock().lock(); 23 Object value = null; 24 try{ 25 value = cache.get(key); 26 if(value == null){ 27 rwl.readLock().unlock(); 28 rwl.writeLock().lock(); 29 try{ 30 if(value == null){ 31 value = "abc";//实际是去queryDB(); 32 } 33 }finally{ 34 rwl.writeLock().unlock(); 35 } 36 rwl.readLock().lock(); 37 } 38 }finally{ 39 rwl.readLock().unlock(); 40 } 41 return value; 42 } 43 44 }