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,则不会提示错误;我一直怀疑这样定义是否重复了,麻烦大家指点,我刚初学,不是很懂。

解决方案 »

  1.   

    这种定义倒是不多余,分别重新定义两把锁而已,不过我这没有提示有错误在使用某些种类的 Collection 时,可以使用 ReentrantReadWriteLock 来提高并发性。通常,在预期 collection 很大,读取者线程访问它的次数多于写入者线程,并且 entail 操作的开销高于同步开销时,这很值得一试。使用Lock时应该注意unlock,比较好的方式是:
    r.lock(); try { return m.get(key); } finally { r.unlock(); }
    即先上锁,然后进入try-finally语句进行解锁
      

  2.   

    后面不是定义,是对两个成员赋值。声明与使用时变量名要保持一致。读写锁,提高Collection操作的并发性。