java读写锁问题(ReentrantReadWriteLock) 本帖最后由 dm520 于 2009-10-06 23:44:23 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没用过参考下http://www.diybl.com/course/3_program/java/javashl/20071129/89472.html 你用2个lock分别锁住read和write方法 其实就等于没有上锁真正应该去lock的应该是你读和写的那个[资源] 怎么相当于没上锁呢,读写锁是不算是互斥锁,只是写独占的锁,当写的时候就不能在进行写和读,但是当写锁释放的时候,读的时候可以有多个线程共享的读LZ的程序的意思就是当调用write的时候就不能在调用read,但是写锁释放的情况下,可以多个线程共享的调用read,不存在并发问题。LZ你所说的没有锁住是什么情况啊,是在写的时候,可以读吗?? 我看了官方的api也是这样写的,因为这两个锁是 ReentrantReadWriteLock rwl 对象生成的,应该是属于一个锁。 哎呀 夹资源和夹方法都是夹嘛 哈哈哈 但是lock肯定要是一个的对吧?public class JsonUtil { private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private static final Lock lock = ReadWriteLock(); // private static final Lock wLock = rwl.writeLock(); public static void read(){ try{ lock.readlock(); 读的一些操作。。 } finally { lock.readUnlock(); } } public static void write(){ try{ lock.writelock(); 写的一些操作。。 } finally { lock.writeUnlock(); } }我没有试过 但是应该这样就sync了 额 楼主你试试不用 rlock=rwl.readlock;和 wlock=rwl.writelock; 就直接用rwl.readlock.lock();和rwl.writelock.lock();我觉得原因可能是因为你定义了两个新锁而这两个锁之间没有关联。个人认为读写锁锁的并不是代码或者对象或者数据缓存神马的,本质应该是锁住得到锁的权利。就是当一个线程锁上了写锁那么其它线程在调用这个锁时就需要等待直到那个线程的写锁被打开才能让后面的线程上锁。读锁的话 就是当一个线程上了读锁 其它线程也可以上读锁直到所有的读锁都被打开也就是count=0的时候另外的线程才能上写锁。 Spring 事务管理拦截器疑问 java 动态数组问题 高手给写个东西撒! 同一个对象为什么hashcode不一样, 菜鸟关于线程问题,等待 java 将数据库表连接到 JTable 总是报错 java格式化输出word文档 可执行jar中classpath问题 求 MapXtreme for java 4.5下载地址,找了好久都没找到,谢谢了! 关于文件操作的问题,无法检测文件的属性,,多谢指教!! 如何解决java.util.ConcurrentModificationException static变量
参考下http://www.diybl.com/course/3_program/java/javashl/20071129/89472.html
真正应该去lock的应该是你读和写的那个[资源]
LZ的程序的意思就是当调用write的时候就不能在调用read,但是写锁释放的情况下,可以多个线程共享的调用read,不存在并发问题。
LZ你所说的没有锁住是什么情况啊,是在写的时候,可以读吗??
我看了官方的api也是这样写的,因为这两个锁是 ReentrantReadWriteLock rwl 对象生成的,应该是属于一个锁。
哎呀 夹资源和夹方法都是夹嘛 哈哈哈 但是lock肯定要是一个的对吧?
public class JsonUtil {
private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private static final Lock lock = ReadWriteLock();
// private static final Lock wLock = rwl.writeLock();
public static void read(){
try{
lock.readlock();
读的一些操作。。 } finally {
lock.readUnlock();
}
} public static void write(){
try{
lock.writelock();
写的一些操作。。 } finally {
lock.writeUnlock();
}
}
我没有试过 但是应该这样就sync了
我觉得原因可能是因为你定义了两个新锁而这两个锁之间没有关联。
个人认为读写锁锁的并不是代码或者对象或者数据缓存神马的,本质应该是锁住得到锁的权利。就是当一个线程锁上了写锁那么其它线程在调用这个锁时就需要等待直到那个线程的写锁被打开才能让后面的线程上锁。读锁的话 就是当一个线程上了读锁 其它线程也可以上读锁直到所有的读锁都被打开也就是count=0的时候另外的线程才能上写锁。