Java 读写锁ReadWriteLock

[b]Java 读写锁ReadWriteLock[/b]


读写锁相对于线程互斥的优势在于高效,它不会对两个读线程进行盲目的互斥处理,当读线程数量多于写线程尤其如此,当全是写线程时两者等效。(多用于读多写少时使用)


1.读锁可以允许多个进行读操作的线程同时进入,但不允许写进程进入。
2.写锁只允许一个写进程进入,在这期间任何进程都不能再进入。

注意:每个读写锁都有挂锁和解锁,最好将每一对挂锁和解锁操作都用try、finally来套入中间的代码,这样就会防止因异常的发生而造成死锁得情况。


例子:
import java.util.Random;
import java.util.concurrent.locks.*;

public class ReadWriteLockTest {
public static void main(String[] args) {
final TheData myData = new TheData(); // 这是各线程的共享数据
for (int i = 0; i < 3; i++) { // 开启3个读线程
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
myData.get();
}
}
}).start();
}
for (int i = 0; i < 3; i++) { // 开启3个写线程
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
myData.put(new Random().nextInt(10000));
}
}
}).start();
}
}
}

class TheData {
private Object data = null;
private ReadWriteLock rwl = new ReentrantReadWriteLock();

public void get() {
rwl.readLock().lock(); // 读锁开启,读线程均可进入
try { // 用try finally来防止因异常而造成的死锁
System.out.println(Thread.currentThread().getName() + "is ready to read");
Thread.sleep(new Random().nextInt(100));
System.out.println(Thread.currentThread().getName() + "have read date" + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
rwl.readLock().unlock(); // 读锁解锁
}
}

public void put(Object data) {
rwl.writeLock().lock(); // 写锁开启,这时只有一个写线程进入
try {
System.out.println(Thread.currentThread().getName() + "is ready to write");
Thread.sleep(new Random().nextInt(100));
this.data = data;
System.out.println(Thread.currentThread().getName() + "have write date" + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
rwl.writeLock().unlock(); // 写锁解锁
}
}
}



参考(ReentrantReadWriteLock类和ReentrantLock类的区别):[url]http://blog.csdn.net/kai_wei_zhang/article/details/8197061[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jie310600

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值