每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。
当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁是可重入的,因此如果摸个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。“重入”意味着获取锁的操作的粒度是“线程”,而不是调用。重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程所持有,当线程请求一个未被持有的锁时,JVM将几下锁的持有者,并且将获取计数值置为1,如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应地递减。当计数值为0时,这个锁将被释放。
重入进一步提升了加锁行为的封装性,因此简化了面向对象并发代码的开发。分析如下程序:
public class Father
{
public synchronized void doSomething(){
......
}
}
public class Child extends Father
{
public synchronized void doSomething(){
......
super.doSomething();
}
}
子类覆写了父类的同步方法,然后调用父类中的方法,此时如果没有可重入的锁,那么这段代码件产生死锁。
由于Fither和Child中的doSomething方法都是synchronized方法,因此每个doSomething方法在执行前都会获取Father上的锁。如果内置锁不是可重入的,那么在调用super.doSomething时将无法获得Fither上的锁,因为这个锁已经被持有,从而线程会永远阻塞下去,一直在等待一个永远也无法获取的锁。重入则避免了这种死锁情况的发生。
分享到:
相关推荐
9. Java内置锁的重入性:内置锁是可重入的,允许同一个线程在拥有锁的情况下再次获得该锁,这避免了线程因再次请求自己已持有的锁而出现死锁的情况。 10. 锁的粒度控制与性能权衡:过于粗粒度的锁会降低并发性,而...
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
《Java并发编程实战》是一本深入探讨Java多线程和并发编程的经典著作,它为开发者提供了全面、实用的指导,帮助他们理解和解决并发问题。这本书的中文版使得更多的中国开发者能够受益于其丰富的知识和实践经验。 ...
5. **多线程**:Java内置了强大的多线程支持,笔记会讲述如何创建和管理线程,以及同步机制如synchronized关键字和wait/notify方法,帮助开发者理解和实现并发程序。 6. **网络编程**:Java提供了丰富的网络编程API...
除了`synchronized`,Java还提供了丰富的并发工具类,如`java.util.concurrent`包中的`Semaphore`(信号量)、`ReentrantLock`(可重入锁)、`BlockingQueue`(阻塞队列)等,它们提供了更灵活和高效的并发控制。...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。"大虾的笔记"很可能是某位资深Java开发者或教育者整理的学习资料集合,这些文档可能包含了丰富的Java编程知识,从基础概念到高级特性,...
《良葛格的Java学习笔记》是一本专为Java初学者设计的教程,作者林信良深入浅出地讲解了Java编程的基础知识。这本笔记覆盖了Java学习的重要概念,包括但不限于以下几个方面: 1. **Java简介**:Java是一种跨平台、...
【跃达创新JAVA课堂笔记】是一份集合了Java编程语言核心知识及实战应用的宝贵资料。这份笔记由跃达创新教育机构提供,旨在帮助学习者深入理解和掌握Java技术。通过这些笔记,我们可以了解到以下几个关键的知识点: ...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者喜爱。这份"个人Java学习过程中所有学习笔记"包含了作者在学习Java时积累的宝贵经验,旨在帮助初学者或有经验的程序员巩固基础...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。这份"java笔记与java核心内容解读"集合了网上广泛讨论的Java知识,旨在帮助初学者和有经验的开发者深入理解Java的关键概念和技术。 Java...
总结,"达内教育 Java从入门到高级全套课堂笔记"应该包含了这些知识点的详细讲解,帮助学习者系统地学习Java编程,从基础知识到高级特性和实战应用,全面提高编程能力。通过深入学习和实践,你可以成为一名熟练的...
【标题】:“韩顺平java从入门到精通上课所有笔记源码”是一个全面学习Java编程的资源集合,其中包含了韩顺平老师在教授Java技术时的详细笔记和配套源代码。这个标题暗示了该压缩包内容是针对初学者和进阶者设计的,...
5. **多线程**:Java提供了内置的多线程支持,笔记可能会讲解Thread类、Runnable接口,同步机制(synchronized关键字、wait/notify、Lock接口)以及并发工具类如Semaphore、CountDownLatch等。 6. **IO流与NIO**:...
线程是并发编程的基础,Java提供内置的线程支持。笔记会讲解线程的创建、同步和通信,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及死锁和线程池的概念。 除此之外,笔记可能还会涉及Java的...
Java编程语言是软件开发领域中的一个基石,尤其在企业级应用和互联网服务中占据着重要地位。本资料包“java笔记”聚焦于Java的学习,旨在为初学者和有一定经验的开发者提供深入理解Java核心概念、语法和技术的资源。...
- 面试题:掌握常问的Java面试题,如八大排序算法、设计模式、并发编程等。 - 实战经验:能够描述个人参与过的项目,展示解决过的技术难题。 通过【笔记CoderEsky】中的资料,你将有机会系统地学习和巩固Java编程...
《北京圣思园 Java SE经典笔记》是一份珍贵的学习资料,包含了Java标准版(Java SE)的核心知识,旨在帮助开发者深入理解和掌握Java编程语言。这份笔记由经验丰富的讲师张龙老师整理,深受学习者好评。以下是对其中...
6. **多线程**:Java内置了强大的多线程支持,理解线程的创建、同步、通信,以及并发编程的相关概念,如volatile、synchronized、Lock等。 7. **网络编程**:Java提供了Socket编程接口,用于实现客户端-服务器通信...
Java学习笔记之一些面试题,主要涵盖了Spring、Spring Boot和Spring Cloud这三个核心领域的知识点。这是一份深入理解Java后端开发技术的宝贵资料,旨在帮助开发者在面试中展现出扎实的技术功底。 首先,我们来看看...