请各位 帮我解释下 为什么 synchronized没 ReentrantReadWriteLock 的性能好

10-08-25 zhaoqilong3031
synchronized

------------------

public int getState() {

return state;

}

public synchronized void setState(int a) {

this.state = a;

}

**********************************

ReentrantReadWriteLock

-------------------------

public int getState() {

read.lock();

try {

return state;

} finally {

read.unlock();

}

}

public void setState(int a) {

write.lock();

try {

this.state = a;

} finally {

write.unlock();

}

}

在网上找好多资料 都说 ReentrantReadWriteLock 的性能比 synchronized 高?

我看不出如果是这样都一样的 我用synchronized 只锁住set方法 读取的时候 用get没有任何锁

并不影响读取

              

banq
2010-08-26 07:45
后者有使用前提,是写不频繁,读频繁,后者主要应用了并行优化,所以,在这一特殊前提下,性能要好点,但是因为多线程锁机制本身天然缺点,性能要整体差与非多线程比如scala。

vvgg
2010-08-26 09:58
get set 也是要同步的,你这个例子不明显

读写锁分离 是为了 get get 之间使不要同步

bbo268
2010-08-26 10:23
第一种方式会有并发问题

get 没加锁,写到一半可能会被读

应同时了也加上synchronized

synchronized 默任为当前对像加了一把ReentrantLock

所以 会出现一个线程读另一个线程不能进入的现像

因为只要线程进入就互斥 不论读写

ReentrantReadWriteLock 其实是加了两把锁

写锁排斥读 写

读锁只排斥 写 所以能达到并发读的效果 克服了synchronized 读互斥的缺点

所以说 ReentrantReadWriteLock 比synchronized 快

[该贴被bbo268于2010-08-26 10:24修改过]

zhaoqilong3031
2010-08-27 10:53
谢谢啊 现在算是有点明白了 之前一直是转不过弯

猜你喜欢
2Go 1 2 下一页