缓存重新加载放置块

时间:2017-08-22 14:43:59

标签: multithreading caching

如何在调用缓存重新加载时阻止put方法。

示例:这些是虚拟类而不是实际类。

缓存类

公共类Class1 {

private static Map<Integer, Integer> map = new HashMap<>();

public Class1() {
    for (int i = 0; i < 20; i++) {
        map.put(i, ++i);
    }
}

public void reload() throws InterruptedException {
    Map<Integer, Integer> exist = map;
    System.out.println("are you waiting ");
    System.out.println("waiting over");
    map = new HashMap<>();
    for (Map.Entry<Integer, Integer> entry : exist.entrySet()) {
        map.put(entry.getKey(), entry.getValue());
    }
    for (int i = 100; i < 120; i++) {
        map.put(i, ++i);
    }
}

public Map<Integer, Integer> getMap() {
    return map;
}

}

初始化缓存的类

公共类Class2 {

private static Class1 cache = new Class1();;

public Class1 getCache() {
    return cache;
}

public void reload() throws InterruptedException {
    cache.reload();
}

}

使用缓存的类

package com.diaryreaders.corejava.algorithms.dp;

公共类Class3 {

public static void main(String[] args) {
    final Class2 klass = new Class2();
    Runnable runn1 = new Runnable() {

        @Override
        public void run() {
            int i = 50, j = 50;
            while (i < 100) {
                System.out.println("I am stuck due to lock");
                klass.getCache().getMap().put(i++, j++);
                System.out.println(klass.getCache().getMap());
            }
        }
    };

    Runnable runn2 = new Runnable() {

        @Override
        public void run() {
            try {
                System.out.println("Calling reloading");
                klass.reload();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    Thread t1 = new Thread(runn1);
    Thread t2 = new Thread(runn2);
    t1.start();
    t2.start();
}

}

当线程t2正在调用重新加载时,应该阻止t1,即阻塞缓存放置方法直到重新加载完成

0 个答案:

没有答案