问题描述
public class Test {private static List<String> list ;static{list = new ArrayList<String>();list.add("0");list.add("1");list.add("2");list.add("3");}public String get(int subscript){return list.get(subscript);}public boolean update(){list.clear();list.add("a");list.add("b");list.add("c");list.add("d");return true;}private Test(){}public static Test getInstance(){return SingleHolder.instance;} private static class SingleHolder{private static final Test instance = new Test();}}程序在正在调用 get 时 不能调用 update 当程序正在调用update 时 get 不能调用update 可能n久不能调用如果加锁 怎么写性能最高
解决方案
楼上的方式最好了!当然如果仅仅是对数组或Map的操作可以试试已经提供的集合类如:CopyOnWriteArrayList 比较适合多读取很少更新的操作。比锁的机制更高效。常用的方法 addIfAbsent,addAllAbsent,addAll,add,removeAll 如果能灵活运用,应该也可以满足需求了
解决方案二:
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final Lock r = rwl.readLock(); private final Lock w = rwl.writeLock(); public String get(int subscript){ r.lock();try{ return list.get(subscript); }finally{r.unlock();} } public boolean update(){ w.lock();try{ list.clear(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); return true; }finally{w.unlock();} } 这样才是最优的(就目前本人所知),至于原理参考jdk文档或者网络资料吧
解决方案三:
方法1: List变成vector,那么可以在最细粒度控制线程安全。方法2: public String get(int subscript){ synchronized (this) { return list.get(subscript); }} public boolean update(){ synchronized (this) { list.clear(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); return true; } } 方法3,在以上两个方法上直接加上 synchronized 。好坏从1到3。