大家帮忙看看这个读写锁定义问题
package Test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
public class MyArrayListA{
private Object[]data;
private int count;
private Lock rlock;
private Lock wlock;
public MyArrayListA(){
data=new Object[10];
count=0;
ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
rlock=lock.readLock();
wlock=lock.writeLock();
}
public synchronized void add(Object obj){
data[count]=obj;
for(int i=0;i<100000;i++)
;
count++;
}
public void remove(){
wlock.lock();
wlock.unlock();
}
public void add2(Object obj){
try{
wlock.lock();
data[count]=obj;
for(int i=0;i<100000;i++)
;
count++;
}finally{
wlock.unlock();
}
}
public synchronized String toString(){
StringBuffer sb=new StringBuffer("[");
for(int i=0;i<count;i++){
sb.append(data[i]+",");
}
sb.append("]");
return sb.toString();
}
public Object get(int index){
rlock.lock();
rlock.unlock();
return index;
}
}
疑问:在程序中:private Lock rlock;private Lock wlock; 这两个定义是否多余了? 因为在后面的代码中: ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
rLock=lock.readLock();
wLock=lock.writeLock();
又出现了对这两个读写锁rlock和wlock的定义,而且Eclipse一直在编译是提示错误, 为什么?如果我把他们改成小写的rlock和wlock,则不会提示错误;我一直怀疑这样定义是否重复了,麻烦大家指点,我刚初学,不是很懂。
------解决方案--------------------
这种定义倒是不多余,分别重新定义两把锁而已,不过我这没有提示有错误
在使用某些种类的 Collection 时,可以使用 ReentrantReadWriteLock 来提高并发性。通常,在预期 collection 很大,读取者线程访问它的次数多于写入者线程,并且 entail 操作的开销高于同步开销时,这很值得一试。
使用Lock时应该注意unlock,比较好的方式是:
r.lock(); try { return m.get(key); } finally { r.unlock(); }
即先上锁,然后进入try-finally语句进行解锁
------解决方案--------------------