java读写锁问题(ReentrantReadWriteLock)

dm520 2009-10-06 11:43:14
为什么用ReentrantReadWriteLock不能锁住呢?
我是这样的用的,如下:




public class JsonUtil {
private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private static final Lock rLock = rwl.readLock();
private static final Lock wLock = rwl.writeLock();

public static void read(){
try{
rLock.lock();
读的一些操作。。。。。

} finally {
rLock.unlock();
}
}

public static void write(){
try{
wLock.lock();
写的一些操作。。。。。

} finally {
wLock.unlock();
}
}


不知道有什么问题,主要是进行多线程的时候 不能锁住 ,请高手指点。
...全文
535 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiramisulongteng 2012-04-29
  • 打赏
  • 举报
回复
额 楼主你试试不用 rlock=rwl.readlock;和 wlock=rwl.writelock; 就直接用rwl.readlock.lock();和rwl.writelock.lock();
我觉得原因可能是因为你定义了两个新锁而这两个锁之间没有关联。
个人认为读写锁锁的并不是代码或者对象或者数据缓存神马的,本质应该是锁住得到锁的权利。就是当一个线程锁上了写锁那么其它线程在调用这个锁时就需要等待直到那个线程的写锁被打开才能让后面的线程上锁。读锁的话 就是当一个线程上了读锁 其它线程也可以上读锁直到所有的读锁都被打开也就是count=0的时候另外的线程才能上写锁。
swandragon 2009-10-09
  • 打赏
  • 举报
回复
关注
dm520 2009-10-09
  • 打赏
  • 举报
回复
up起来
lee_09 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coldanimal 的回复:]
你用2个lock分别锁住read和write方法 其实就等于没有上锁
真正应该去lock的应该是你读和写的那个[资源]
[/Quote]
比较少用
999朵玫瑰 2009-10-07
  • 打赏
  • 举报
回复
怎么相当于没上锁呢
loveofmylife 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coldanimal 的回复:]
你用2个lock分别锁住read和write方法 其实就等于没有上锁
真正应该去lock的应该是你读和写的那个[资源]
[/Quote]
怎么相当于没上锁呢,读写锁是不算是互斥锁,只是写独占的锁,当写的时候就不能在进行写和读,但是当写锁释放的时候,读的时候可以有多个线程共享的读
LZ的程序的意思就是当调用write的时候就不能在调用read,但是写锁释放的情况下,可以多个线程共享的调用read,不存在并发问题。
LZ你所说的没有锁住是什么情况啊,是在写的时候,可以读吗??
一头头 2009-10-07
  • 打赏
  • 举报
回复
你用2个lock分别锁住read和write方法 其实就等于没有上锁
真正应该去lock的应该是你读和写的那个[资源]
SnowingXimen 2009-10-07
  • 打赏
  • 举报
回复
这个们,程序写的真有意思!
哈哈 :O
一头头 2009-10-07
  • 打赏
  • 举报
回复
把lock放try外面呢 ?
一头头 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 viszl 的回复:]
引用 2 楼 coldanimal 的回复:
你用2个lock分别锁住read和write方法 其实就等于没有上锁
真正应该去lock的应该是你读和写的那个[资源]

怎么相当于没上锁呢,读写锁是不算是互斥锁,只是写独占的锁,当写的时候就不能在进行写和读,但是当写锁释放的时候,读的时候可以有多个线程共享的读
LZ的程序的意思就是当调用write的时候就不能在调用read,但是写锁释放的情况下,可以多个线程共享的调用read,不存在并发问题。
LZ你所说的没有锁住是什么情况啊,是在写的时候,可以读吗??
[/Quote]

哎呀 夹资源和夹方法都是夹嘛 哈哈哈 但是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了

dm520 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 viszl 的回复:]
引用 2 楼 coldanimal 的回复:
你用2个lock分别锁住read和write方法 其实就等于没有上锁
真正应该去lock的应该是你读和写的那个[资源]

怎么相当于没上锁呢,读写锁是不算是互斥锁,只是写独占的锁,当写的时候就不能在进行写和读,但是当写锁释放的时候,读的时候可以有多个线程共享的读
LZ的程序的意思就是当调用write的时候就不能在调用read,但是写锁释放的情况下,可以多个线程共享的调用read,不存在并发问题。
LZ你所说的没有锁住是什么情况啊,是在写的时候,可以读吗??
[/Quote]
应该是在 写的时候可以读 ,出现的现象是这样的,就是只写进去了前面一部分数据,没有写全,导致读的时候报错
dm520 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coldanimal 的回复:]
你用2个lock分别锁住read和write方法 其实就等于没有上锁
真正应该去lock的应该是你读和写的那个[资源]
[/Quote]

我看了官方的api也是这样写的,因为这两个锁是 ReentrantReadWriteLock rwl 对象生成的,应该是属于一个锁。
dm520 2009-10-07
  • 打赏
  • 举报
回复
就是在我多线程读写的时候报错,出现了写的时候信息没有写完就开始读了,导致读的时候报错。
m_angle_m 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coldanimal 的回复:]
你用2个lock分别锁住read和write方法 其实就等于没有上锁
真正应该去lock的应该是你读和写的那个[资源]
[/Quote]
同意

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧