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. ppk on JavaScript第二章:背景(完结篇)
  2. ping的实现和代码分析
  3. 能买到鸿蒙系统,哪里能买到鸿蒙系统的设备?
  4. c25---条件编译
  5. SQL Server中,with as使用介绍
  6. 《C++字符串完全指南——第一部分:win32 字符编码》
  7. 电信业务分类目录_第五大运营商!中信网络获基础电信业务牌照
  8. adobe blueprint
  9. Android Theme主题
  10. 正式开始学习GO语言
  11. 可以将pdf转换成jpg图片格式的方法
  12. easyphp(xctf)
  13. 升级Win10注意事项个人总结
  14. 一颗椰子糖机器人_一颗椰子糖的热量
  15. 我的JAVA面试经验(5年左右工作经验)
  16. 【Matlab学习手记】三维矢量场图
  17. Ubuntu18.04 RTL8169驱动更换RTL8168驱动
  18. 氧含量测量方法:燃料电池法
  19. 【程序人生】2020 年度总结
  20. javaEye上对于南京软件公司的讨论

热门文章

  1. POJ1003·Hangover
  2. Css实现的鼠标滑动选项卡菜单代码
  3. 疯狂的程序员-第五章
  4. 《Asp.Net 2.0 揭秘》读书笔记(五)
  5. 命名空间不能直接包含_C++程序中可以命名的5种元素
  6. 词频统计 求最大k个数
  7. BUGKU 密码题:这不是摩斯密码
  8. 基本环境安装: Centos7+Java+Hadoop+Spark+HBase+ES+Azkaban
  9. 原创全新打包工具Parcel零配置VueJS开发脚手架
  10. bzoj 4488: [Jsoi2015]最大公约数