2019独角兽企业重金招聘Python工程师标准>>>

我们首先将介绍synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版) ——重入锁。

一、synchronized的功能扩展:重入锁

重入锁可以完全替代synchronized关键字。在JDK5.0的早期版本中,重入锁的性能远远好于synchronized,但从JDK6.0开始,JDK在synchronized上做了大量的优化,是的两者的性能差距并不大。重入锁使用java.util.concurrent.locks.ReentrantLock类来实现。下面是一段最简单的重入锁使用案例:

import java.util.concurrent.locks.ReentrantLock;public class Thread2 implements Runnable{public static ReentrantLock lock = new ReentrantLock();public static int i=0;@Overridepublic void run() {for (int j = 0; j < 1000000; j++) {lock.lock();try {i++;}finally {lock.unlock();}}}public static void main(String[] args) throws InterruptedException {Thread2 rl = new Thread2();//类名Thread t1 = new Thread(rl);Thread t2 = new Thread(rl);t1.start();t2.start();//启动子线程t1、t2t1.join();t2.join();//结束子线程t1、t2System.out.println(i);}
}

根据以上代码,使用重入锁保护临界区资源i,确保多线程对i操作的安全性。从这段代码可以看到,与synchronized相比,重入锁有着显示的操作过程。开发人员必须手动何时枷锁,何时释放锁。也正因为这样,重入锁对逻辑控制的灵活性要远远好于synchronized,但值得注意的是,在退出临界区时,必须记得释放,否则,其它线程就没有机会再访问临界区了。

for (int j = 0; j < 1000000; j++) {lock.lock();lock.lock();try {i++;}finally {lock.unlock();lock.unlock();}
}

一个线程连续两次获得同一把锁。这是允许的!如果不允许这么操作,那么同一个线程在第2次获得锁时,将会和自己产生死锁。程序就会“卡死”在第2次申请锁的过程中。需要注意的是,如果同一个线程多次获得锁,那么在释放锁的时候,也必须释放相同次数。

  • 释放锁的次数多了:会得到一个java.lang.IllegalMonitorStateException异常。
  • 释放锁的次数少了:相当于线程还持有这个锁,因此其它线程也无法进入临界区。

转载于:https://my.oschina.net/Clarences/blog/1547677

同步控制 之“重入锁”相关推荐

  1. Java 重入锁 ReentrantLock 原理分析

    1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...

  2. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  3. 聊聊高并发(十六)实现一个简单的可重入锁

    可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...

  4. synchronized 与 Reentrant均为可重入锁 区别后者比前者增加了长时等待可中断 设置是否公平锁 绑定多个条件

    ① 两者都是可重入锁 两者都是可重入锁."可重入锁"概念是:自己可以再次获取自己的内部锁.比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时 ...

  5. 死磕Java并发:J.U.C之重入锁:ReentrantLock

    ReentrantLock,可重入锁,是一种递归无阻塞的同步机制.它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大.灵活的锁机制,可以减 ...

  6. 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)

    在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...

  7. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  8. 乐观锁和悲观锁,可重入锁和不可重入锁(1)

    乐观锁和悲观锁,可重入锁和不可重入锁(1) 前言 感觉有一段时间没有写博客了呢.还是再接再厉吧,适当程度的总结能让我自己能够更加深入地巩固和理解自己所学习的一切. 还有,我很懒,而且我还是比较喜欢写日 ...

  9. Java高并发编程(六):重入锁

    重入锁定义:重入锁ReentrantLock,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.除此之外,该锁的还支持获取锁时的公平和非公平性选择. ReentrantLock虽然没能像 ...

最新文章

  1. php 提交的数据覆盖,如何高效的做数据覆盖操作
  2. 共读计划 | 你有多久没读完一本书了?
  3. CVPR 2020 开源论文 | 多种可能性行人未来路径预测
  4. 复习日记-validate表单校验插件/菜单管理dTree
  5. 汇编语言之常见的汇编指令
  6. 实验二:SQL server 2005高可用性之----数据库镜像
  7. CV好文推荐+迁移学习经验分享
  8. gitlab 的使用策略和简单介绍
  9. ECharts4简单入门
  10. rm -f .... 恢复
  11. OFFICE必学技巧开篇
  12. 阻止原生输入中文拼音途中会触发input方法的问题
  13. 被罚6500万,“偷税人”雪梨还能直播吗?
  14. 如何用自己的笔记本建wifi热点~~~
  15. moveit和gazebo的联合抓取仿真
  16. 企业IT运维开发一体化解决方案
  17. elasticsearch-starter
  18. 万字文肝Redis基础知识
  19. 新概念1 0--12
  20. Matlab画柱状、饼状填充图(亲测可用)

热门文章

  1. ubuntu下eclipse打开window下的java文件,注释内容为乱码,解决方法
  2. 动态添加的路由 直接访问_VUE 动态路由(二)
  3. Linux Anaconda断网创建虚拟环境
  4. Nginx —— 用HTTP核心模块配置一个静态的Web服务器
  5. BZOJ 4665: 小w的喜糖
  6. 恢复脚本(导入数据库)
  7. 关于target=标签
  8. C语言之父,UNIX之父丹尼斯·里奇去世 享年70岁
  9. Silverlight 3 Tools 中文版地址
  10. SQL SERVER 优化 50法