reentrantlock用于替代synchronized
用于 替代 synchronized ReentrantLock
2023-09-11 14:20:27 时间
1.①使用reentrantlock可以完成同样的功能
②需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)
③使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放
Lock lock = new ReentrantLock(); void m1() { try { lock.lock(); //synchronized(this) for (int i = 0; i < 10; i++) { TimeUnit.SECONDS.sleep(1); System.out.println(i); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }
2.使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待
/** * 使用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行 * 可以根据tryLock的返回值来判定是否锁定 * 也可以指定tryLock的时间,由于tryLock(time)抛出异常,所以要注意unclock的处理,必须放到finally中 */ void m2() { /* boolean locked = lock.tryLock(); System.out.println("m2 ..." + locked); if(locked) lock.unlock(); */ boolean locked = false; try { locked = lock.tryLock(5, TimeUnit.SECONDS); System.out.println("m2 ..." + locked); } catch (InterruptedException e) { e.printStackTrace(); } finally { if(locked) lock.unlock(); } }
3.使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应;在一个线程等待锁的过程中,可以被打断
Thread t2 = new Thread(()->{ try { //lock.lock(); lock.lockInterruptibly(); //可以对interrupt()方法做出响应 System.out.println("t2 start"); TimeUnit.SECONDS.sleep(5); System.out.println("t2 end"); } catch (InterruptedException e) { System.out.println("interrupted!"); } finally { lock.unlock(); } }); t2.start();
4.ReentrantLock还可以指定为公平锁
private static ReentrantLock lock=new ReentrantLock(true); //参数为true表示为公平锁,请对比输出结果 public void run() { for(int i=0; i<100; i++) { lock.lock(); try{ System.out.println(Thread.currentThread().getName()+"获得锁"); }finally{ lock.unlock(); } } }
相关文章
- 【外部节点】json判断@表示正在处理的当前数组项或对象。过滤器还可用于$引用当前对象之外的属性
- 博客园NET Core 发布工具 dotnet-cnblog,用于上传MarkDown 中的图片到cnblog
- eureka源码:EurekaTransport类用于client与server进行交互
- 推荐一个临时邮箱生成网站,专门用于各种注册用途
- 【图像处理】用于图像分类的局部约束线性编码(Python代码实现)
- 习题 10.1 定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。将运算符函数重载为非成员、非友元的普通函数。编写程序,求两个复数之和。
- C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]
- Carla使用OpenStretMap自动生成地图与制作用于插件的全新存储库
- 左右sqlplus一些方法用于汇总
- 使用GAN 进行异常检测——anoGAN,TODO,待用于安全分析实验
- DGA ngram kmeans+TSNE用于绘图
- JDBC中,用于表示数据库连接的对象是。(选择1项)
- 哪一个对象可以用于获得浏览器发送的请求。
- 一个 JAR 文件可以用于