ReentrantLock具有完全互斥排他的效果,同一时间只有一个线程执行ReentrantLock.lock()方法后面的任务,这样虽然能够保证线程安全性,但是效率是比较低的

ReentrantReadWriteLock可以加快运行效率

ReentrantReadWriteLock读写锁有两个锁,读锁和写锁,读锁是共享锁,写锁是排他锁:

  • 读锁与读锁不互斥
  • 写锁与写锁互斥
  • 读锁与写锁互斥
  • 写锁与读锁互斥

ReentrantReadWriteLock

读锁与读锁不互斥

 public class Test01 {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void read(){
try {
lock.readLock().lock();
System.out.println("获取读锁"+Thread.currentThread().getName()+" "+System.currentTimeMillis());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.readLock().unlock();
}
} public static void main(String[] args) {
Test01 test = new Test01();
Runnable runnable = new Runnable() {
@Override
public void run() {
test.read();
}
};
Thread a = new Thread(runnable);
a.setName("A");
Thread b = new Thread(runnable);
b.setName("B");
a.start();
b.start();
}
}

-------------------------------------------------console-------------------------------------------------

获取读锁A 1539155032025
获取读锁B 1539155032025

打印结果显示线程A,B同时读取锁,证明多个线程获得读锁是不互斥的,使用读锁可以提高程序运行效率

写锁与写锁互斥

 public class Test02 {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void write(){
try {
lock.writeLock().lock();
System.out.println("获取写锁"+Thread.currentThread().getName()+" "+System.currentTimeMillis());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.writeLock().unlock();
}
} public static void main(String[] args) {
Test02 test = new Test02();
Runnable runnable = new Runnable() {
@Override
public void run() {
test.write();
}
};
Thread a = new Thread(runnable);
a.setName("A");
Thread b = new Thread(runnable);
b.setName("B");
a.start();
b.start();
}
}

-------------------------------------------------console-------------------------------------------------

获取写锁A 1539155285755
获取写锁B 1539155295757

证明同一时间只允许一个线程执行lock()方法后面的代码

读锁与写锁互斥,写锁与读锁互斥

 public class Test03 {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void read(){
try { lock.readLock().lock();
System.out.println("获取读锁"+Thread.currentThread().getName()+" "+System.currentTimeMillis());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.readLock().unlock();
}
} public void write(){
try {
lock.writeLock().lock();
System.out.println("获取写锁"+Thread.currentThread().getName()+" "+System.currentTimeMillis());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.writeLock().unlock();
}
} public static void main(String[] args) {
Test03 test = new Test03(); Thread a = new Thread(new Runnable() {
@Override
public void run() {
test.read();
}
});
a.setName("A");
Thread b = new Thread(new Runnable() {
@Override
public void run() {
test.write();
}
});
b.setName("B");
a.start();
b.start();
}
}

-------------------------------------------------console-------------------------------------------------

获取读锁A 1539155559525
获取写锁B 1539155569525

证明读写操作是互斥的,只要出现写操作的过程就是互斥的

最新文章

  1. CodeIgniter_2 路由中定义伪静态 直接映射到相关的控制器
  2. 内存溢出OOM与内存泄漏ML
  3. CRM 403错误
  4. AngularJS学习笔记1
  5. 自动回复消息-微信公众平台开发4(asp.net)
  6. hdu 六度分离 floyd
  7. 【C#学习笔记】读SQL Server2008
  8. CodeForces - 269C Flawed Flow
  9. poj 2429 Pollard_rho大数分解
  10. Oracle EBS-SQL (QA-1):检查超出检验周期的检验数据.sql
  11. GDOI模拟赛Round 1
  12. 移动开发的框架(用Firepower,不用listview,超快) good
  13. [其他]volatile 关键字
  14. Ubuntu下如何解压各类文件
  15. 教你如何取消GCD任务
  16. JavaScript(四)变量
  17. 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】
  18. Java设计模式总结
  19. 暗之的锁链 [COGS2434] [树上差分]
  20. 关于vs code 快速生成vue 模板

热门文章

  1. opencv中图像的读取,显示与保存1
  2. 帮助_NOI导刊2010提高(03)
  3. VINS 估计器之优化与边缘化
  4. form 表单的name
  5. 二、kubernetes搭建集群
  6. linux用户的基本操作2 用户密码管理
  7. Android 混淆总结(直接copy)(转)
  8. springboot基于注解动态配置多数据源以及多数据源的事务统一
  9. H3C F100-S-G2接口配置
  10. nmap使用笔记