`
TrueBrian
  • 浏览: 8971 次
社区版块
存档分类
最新评论

Java并发编程:可重入内置锁

 
阅读更多

每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。

当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重入的,因此如果摸个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。“重入”意味着获取锁的操作的粒度是“线程”,而不是调用。重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程所持有,当线程请求一个未被持有的锁时,JVM将记下锁的持有者,并且将获取计数值置为1,如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应地递减。当计数值为0时,这个锁将被释放。

重入进一步提升了加锁行为的封装性,因此简化了面向对象并发代码的开发。分析如下程序:

  1. publicclassFather
  2. {
  3. publicsynchronizedvoiddoSomething(){
  4. ......
  5. }
  6. }
  7. publicclassChildextendsFather
  8. {
  9. publicsynchronizedvoiddoSomething(){
  10. ......
  11. super.doSomething();
  12. }
  13. }

子类覆写了父类的同步方法,然后调用父类中的方法,此时如果没有可重入的锁,那么这段代码件产生死锁。

由于Fither和Child中的doSomething方法都是synchronized方法,因此每个doSomething方法在执行前都会获取Child对象实例上的锁。如果内置锁不是可重入的,那么在调用super.doSomething时将无法获得该Child对象上的互斥锁,因为这个锁已经被持有,从而线程会永远阻塞下去,一直在等待一个永远也无法获取的锁。重入则避免了这种死锁情况的发生。

同一个线程在调用本类中其他synchronized方法/块或父类中的synchronized方法/块时,都不会阻碍该线程地执行,因为互斥锁时可重入的。

分享到:
评论

相关推荐

    《java 并发编程实战高清PDF版》

    锁是Java并发编程中用于同步的关键工具。书中深入剖析了各种锁机制,如内置锁(也称为监视器锁),通过`synchronized`关键字实现。此外,还介绍了高级的锁接口`java.util.concurrent.locks`,如`ReentrantLock`,它...

    java并发编程艺术

    锁机制是Java并发编程中的另一大主题,包括内置锁(互斥锁)和显式锁(如`ReentrantLock`)。内置锁是`synchronized`关键字提供的,而显式锁提供了更细粒度的控制和更丰富的功能。书中可能还会讨论读写锁(`...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...

    Java 并发核心编程

    ### Java 并发核心编程知识点解析 #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这...理解和掌握这些概念和技术是成功进行并发编程的关键。

    java并发编程

    5. **ReentrantLock**: 这是可重入的互斥锁,比`synchronized`关键字更灵活,支持公平锁和非公平锁,以及可中断和定时等待。 6. **Atomic* 类**: 如AtomicInteger、AtomicLong等,提供了原子操作,保证在并发环境下...

    JAVA并发编程实践

    - **ReentrantLock**:可重入锁,提供了比synchronized更强大的锁定机制。 - **ReadWriteLock**:读写锁,允许多个读锁存在但只有一个写锁,适用于读多写少的情况。 #### 2.2 原子操作 - **Atomic类族**:如`...

    java并发编程实战高清版pdf

    Java并发编程涉及到许多关键概念,如线程、同步、锁、并发容器、原子变量以及并发工具类等。以下是一些主要的知识点: 1. **线程基础**:线程是程序执行的最小单位,Java中的`Thread`类提供了创建和管理线程的方法...

    Java并发编程实战

    2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad...

    Java并发编程学习笔记

    Java并发编程是指在Java语言中编写多线程和多任务执行的程序,以便更高效地利用计算机的多核处理器资源。并发编程是Java高级编程技能中的重要组成部分,尤其是在需要处理大量数据、提供快速响应、实现高吞吐量和高可...

    深入理解并发编程

    目前多数高级编程语言如Java、C#、Go等都内置了强大的并发支持,提供了线程、协程等并发原语,有助于简化并发编程的复杂性。此外,一些并发编程库和框架也能够帮助开发者更好地实现和管理并发任务。 综上所述,...

    Java并发编程进阶练习代码

    本练习集专注于提升你在Java并发编程中的技巧,通过一系列逐步进阶的代码实例,帮助你掌握从基础到高级的并发概念。 首先,我们从“线程安全”开始。线程安全是指在多线程环境下,一个类或方法能够正确地处理并发...

    java并发编程实践中文版和英文版

    《Java并发编程实践》是一本深入探讨Java平台上的并发编程的经典著作。这本书旨在帮助开发者理解和掌握如何有效地编写多线程程序,以充分利用现代处理器的多核能力,提高应用程序的性能和响应性。以下是对该书内容的...

    java并发编程技术

    内置锁通过方法或代码块的同步关键字实现,而显式锁提供了更灵活的控制,如可重入、公平性等特性。 4. **并发包JUC(Java Util Concurrency)**:JUC是Java提供的高级并发工具包,包含如Semaphore(信号量)、...

    读书笔记-Java并发编程实战-基础篇

    9. Java内置锁的重入性:内置锁是可重入的,允许同一个线程在拥有锁的情况下再次获得该锁,这避免了线程因再次请求自己已持有的锁而出现死锁的情况。 10. 锁的粒度控制与性能权衡:过于粗粒度的锁会降低并发性,而...

    [中文]Java并发编程的艺术pdf

    《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考。...通过学习《Java并发编程的艺术》,开发者可以深入理解Java并发原理,掌握有效的并发编程技巧,从而编写出高效、稳定、可维护的多线程程序。

    Java并发编程实战.pptx

    Java并发编程实战需要了解Java中的线程模型、锁机制、线程池、并发集合类等概念和技术,以及如何使用Java中的各种并发编程工具和框架来实现高效、可靠的并发编程。 Java并发编程实战的目标是提高程序的响应速度、...

    Java 并发编程实战

    2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-...

    java 并发编程教程

    `ReentrantLock`是可重入锁,提供了更多的灵活性,如尝试获取锁、可中断的锁等待、公平锁等特性。 死锁是并发编程中的一个常见问题,发生在两个或更多线程互相等待对方释放资源,导致所有线程都无法继续执行。预防...

Global site tag (gtag.js) - Google Analytics