A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

相比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();
      }

}

3 个回复

倒序浏览
张志辉 来自手机 中级黑马 2018-12-26 21:23:36
沙发
赞赞赞,很好
回复 使用道具 举报
回复 使用道具 举报
Vicky韦 来自手机 黑马粉丝团 2018-12-26 21:35:35
板凳
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马