您的位置:首页 > 其它

ReentrantReadWriteLock 读写锁

2017-04-28 08:42 417 查看
/**
* 读写锁ReentrantReadWriteLock
* 读写分离可以有效地减少锁的竞争
* 在ReentrantLock中如果给读线程加锁,那么写线程就需要等待
* 给写线程加锁,那么读线程就得等待
* 这显然是不合理的,因为读操作不会对数据的完整性破坏。
* 所以在读的次数远远大于写的次数的时候,使用读写锁子
* @author beiyaoyao
*/
public class ReadWriteLockDemo {

private static Lock lock = new ReentrantLock();

private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

private static Lock readLock = reentrantReadWriteLock.readLock();

private static Lock writeLock = reentrantReadWriteLock.readLock();

private int value;

public Object readMission(Lock lock) throws InterruptedException {

try {
//描述读操作
lock.lock();
Thread.sleep(1000);
return value;
} finally {
lock.unlock();
}

}

public void writeMission(Lock lock,int num) throws InterruptedException {
try {
//描述写操作
lock.lock();
Thread.sleep(1000);
value = num;
System.out.println(value);
} finally {
lock.unlock();
}
}

public static void main(String[] args) {

final  ReadWriteLockDemo  readWriteLockDemo = new ReadWriteLockDemo();
//读线程
Runnable readThread = new Runnable() {

@Override
public void run() {
try {
//两把锁子交替使用
//                  readWriteLockDemo.readMission(readLock);
readWriteLockDemo.readMission(lock);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//写线程
Runnable writeThread = new Runnable() {

@Override
public void run() {
try {
//两把锁子交替使用
//                  readWriteLockDemo.writeMission(writeLock,new Random().nextInt());
readWriteLockDemo.writeMission(lock,new Random().nextInt());
} catch (InterruptedException e) {
e.printStackTrace();
}

}
};

//夸张的例子 读18次
for(int i = 0  ; i < 18 ; i ++){
new Thread(readThread).start();
}
//写2次
for(int i = 0  ; i < 2 ; i ++){
new Thread(writeThread).start();
}

}

}


如果使用重入锁,那么这段程序的执行时间在20秒左右

如果使用读写锁,那么这段程序的执行时间在2秒左右
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程 竞争