黑马程序员技术交流社区

标题: 【太原校区】Java中的读写锁 [打印本页]

作者: 郝永亮    时间: 2018-12-26 21:21
标题: 【太原校区】Java中的读写锁
相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。Java5在java.util.concurrent包中已经包含了读写锁。下面演示读写锁的使用
[Java] 纯文本查看 复制代码
public class Cache {
      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) {
           } 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 object = map.put(key, value);
                 System.out.println("正在做写的操作,key:" + key + ",value:" + value + "结束.");
                 System.out.println();
                 return object;
           } catch (InterruptedException e) {
           } finally {
                 w.unlock();
           }
           return value;
      }


      // 清空所有的内容
      public static final void clear() {
           w.lock();
           try {
                 map.clear();
           } finally {
                 w.unlock();
           }
      }



      public static void main(String[] args) {
           new Thread(new Runnable() {
                 @Override
                 public void run() {
                      for (int i = 0; i < 10; i++) {
                            Cache.put(i + "", i + "");
                      }
                 }
           }).start();

           new Thread(new Runnable() {
                 @Override
                 public void run() {
                      for (int i = 0; i < 10; i++) {
                            Cache.get(i + "");
                      }
                 }
           }).start();
      }

}


作者: 张志辉    时间: 2018-12-26 21:23
赞赞赞,很好
作者: 郝永亮    时间: 2018-12-26 21:23

作者: Vicky韦    时间: 2018-12-26 21:35





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2