package com.wn.lock; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; /* * 对比java中的锁Locks in java 里lock实现,读写锁更负载一些; * 假设你的措施中涉及到一些共享资源的读和写操纵,且写操纵没有读操纵那么频繁。在没有写操纵的时候,两个线程同时读一个资源没有任何问题,所以应该都答允多个线程能在同时读取共享数据, * 可是假如一个线程想去写这些共享资源,就不该该再有其他线程对该资源举办读或写; * */ public class CacheTest { //建设map荟萃 static Map<String,Object> map=new HashMap<String,Object>(); //建设读写锁 static ReentrantReadWriteLock rwl=new ReentrantReadWriteLock(); //获取读操纵 static Lock r=rwl.readLock(); //获取写操纵 static Lock w=rwl.writeLock(); //获取一个key对应的value public static final Object get(String key){ r.lock(); try { System.out.println("正在做读的操纵,key:"+key+"开始"); Thread.sleep(100); Object object = map.get(key); System.out.println("正在做读的操纵,key:"+key+"竣事"); System.out.println(); return object; } catch (InterruptedException e) { e.printStackTrace(); }finally { r.unlock(); } return key; } //配置key对应的value,并返回旧的value public static final Object put(String key,Object value){ w.lock(); try { System.out.println("正在做写的操纵,key:"+key+",value:"+value+"开始"); Thread.sleep(100); Object o = map.put(key, value); System.out.println("正在做写的操纵,key:"+key+",value:"+value+"竣事"); System.out.println(); return o; } catch (InterruptedException e) { e.printStackTrace(); }finally { w.unlock(); } return value; } public static void main(String[] args){ new Thread(new Runnable() { @Override public void run() { for (int i=0;i<3;i++){ CacheTest.put(i+"",i+""); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i=0;i<3;i++){ CacheTest.get(i+""); } } }).start(); } }
20.BlockingQueue阻塞行列的实现方法阻塞行列(BlockingQueue)是一个支持两个附加操纵的行列,这两个附加的操纵是:
在行列为空时,获取元素的线程会期待行列变为非空;
当行列满时,存储元素的线程会期待行列可用;
阻塞行列常用于出产者和消费者的场景,出产者是往行列里添加元素的线程,消费者是从行列里拿元素的线程。阻塞行列就是出产者存放元素的容器,而消费者也只从容器拿元素;
在java中,BlockingQueue的接口位于java.util.concurrent包中,阻塞行列是线程安详的;