1. 程式人生 > >適用讀寫鎖編寫的一個自定義快取例子

適用讀寫鎖編寫的一個自定義快取例子

package com.ming.thread;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class MingCache {
    /**
     * 用過快取的map
     */
    private Map<String,Object> cache=new HashMap<String,Object>();
    /**
     * 讀寫鎖
     */
private ReadWriteLock lock=new ReentrantReadWriteLock(); /** * 通過快取獲取資料 考慮多執行緒情況 * @author: chenhuaming * @param key * @return * 2018年3月29日下午11:29:28 */ public Object getData(String key){ lock.readLock().lock();//處理多執行緒讀取安全問題 Object obj=null; try
{ obj = cache.get(key); if(null==obj){ lock.readLock().unlock(); lock.writeLock().lock();//處理並情況 try { if(null==obj){//處理併發寫鎖的情況產生的效能問題 obj="ming";//此處去查資料庫 } } catch
(Exception e) { e.printStackTrace(); }finally{ lock.writeLock().unlock(); } lock.readLock().lock(); } } catch (Exception e) { e.printStackTrace(); }finally{ lock.readLock().unlock(); } return obj; } }