읽기 자물쇠의 실현

3409 단어 Java 기반
읽기-쓰기 잠금은 읽기-읽기 공존, 읽기-쓰기 공존, 쓰기-쓰기 공존이 불가능한 상황을 해결하기 위해 주로 읽기-쓰기 분리를 사용한다. 예를 들어 자신이 하나의 캐시를 실현하면 캐시를 새로 고칠 때 읽기-쓰기 잠금을 사용해야 한다.다음은 위의 코드를 훑어보고 간단하게 다음과 같이 실현한다.
/**
 * @author Administrator
 * @date 2019/3/3
 */
public class Cache {
    static Map map=new HashMap();
    static ReentrantReadWriteLock rwl=new ReentrantReadWriteLock();
    static Lock r=rwl.readLock();
    static Lock w=rwl.writeLock();

    /**
     *   key   value
     * @param key
     * @return
     */
    public static final String get(String key){
        r.lock();
        try{
            System.out.println("      ,key: "+key+"----  ");
            String value=map.get(key);
            System.out.println("      ,key: "+key+"----  "+" value:"+value);
            System.out.println();
            return value;
        }catch (Exception e){
            return null;
        }finally {
            r.unlock();
        }
    }

    /**
     *   key   value,
     * @param key
     * @param value
     * @return
     */
    public static final void put(String key,String value){
        w.lock();
        try{
            System.out.println("       ,key:" + key + ",value:" + value + "----  ");
            Thread.sleep(1000);
            map.put(key, value);
            System.out.println("       ,key:" + key + ",value:" + value + "----  ");
            System.out.println();
        }catch (Exception e){

        }finally {
            w.unlock();
        }
    }

    /**
     *        
     */
    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();
    }
}

결과:
쓰기 작업 중, 키:0,value:0--쓰기 작업 시작, 키:0,value:0---끝
쓰기 시작, 키:1, value:1 --쓰기 시작, 키:1, value:1 ----끝
쓰기 작업 중, 키:2,value:2---쓰기 작업 시작, 키:2,value:2---끝
쓰기 작업 중, 키:3,value:3----쓰기 작업 시작, 키:3,value:3----끝
읽기 작업 중, 키: 0 - - - 읽기 시작 중, 키: 0 - 끝value: 0
쓰기 작업 중, 키:4,value:4----쓰기 작업 시작, 키:4,value:4----끝
쓰기 작업 중, 키:5,value:5----쓰기 작업 시작, 키:5,value:5----끝
쓰기 작업 중, 키:6,value:6----쓰기 작업 시작, 키:6,value:6----끝
쓰기 작업 중, 키:7,value:7----쓰기 작업 시작, 키:7,value:7----끝
읽기 작업 중, 키: 1 --- 읽기 작업 시작, 키: 1 --- 끝value:1
읽기 작업 중, 키: 2 - - - 시작 읽기 작업 중, 키: 2 - - 끝value: 2
읽기 작업 중, 키: 3 ----읽기 작업 시작, 키: 3 ----종료value:3
읽기 작업 중, 키: 4 --- 읽기 시작 중, 키: 4 --- 끝value: 4
읽기 작업 중, 키: 5 --- 읽기 시작 중, 키: 5 --- 끝value: 5
읽기 작업 중, 키: 6 - - - 시작 읽기 작업 중, 키: 6 - - 끝value: 6
읽기 작업 중, 키: 7 ----읽기 시작 중, 키: 7 ----종료value:7
읽기 작업 중, 키: 8 ----읽기 작업 시작, 키: 8 ----종료value:null
읽기 작업 중, 키: 9 --- 읽기 시작 중, 키: 9 --- 끝value:null
쓰기 작업 중, 키:8,value:8---쓰기 작업 시작, 키:8,value:8---끝
쓰기 작업 중, 키:9,value:9----쓰기 작업 시작, 키:9,value:9----끝
Process finished with exit code 0

좋은 웹페이지 즐겨찾기