[code="java"]
public class Test {
private static List 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();
}
}
[/code]
程序在正在调用 get 时 不能调用 update
当程序正在调用update 时 get 不能调用
update 可能n久不能调用
如果加锁 怎么写性能最高
楼上的方式最好了!当然如果仅仅是对数组或Map的操作可以试试已经提供的集合类如:
CopyOnWriteArrayList 比较适合多读取很少更新的操作。比锁的机制更高效。常用的方法 addIfAbsent,addAllAbsent,addAll,add,removeAll 如果能灵活运用,应该也可以满足需求了
方法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。
[code="java"] 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();}
}
[/code]
这样才是最优的(就目前本人所知),至于原理参考jdk文档或者网络资料吧