日期:2014-05-20  浏览次数:20743 次

大家帮忙看看这个读写锁定义问题
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语句进行解锁
------解决方案--------------------
探讨
疑问:在程序中:private Lock rlock;private Lock wlock; 这两个定义是否多余了? 因为在后面的代码中: ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
rLock=lock.readLock();
wLock=lock.writeLock();

又出现了对这两个读写锁rlock和wlock的定义,而且Eclipse一直在编译是提示错误, 为什么?如果我把他们改成小写的rlock和wlock,则不会提示错误;我一直怀疑这样定义是否重复了,麻烦大家指点,我刚初学,不是很懂。