花了点时间看了下可重入锁和读写锁的实现:
1. Sync相关:继承自AbstractQueuedSynchronizer抽象类,内部维护了一个state变量,获得一个锁的时候会将改变量置位(变量不为0的时候表示已经被其他的线程Lock了),该变量声明成volatile:
. 由于volatile只满足可见性,不满足原子性,但是在获取锁的时候需要判断是否当前的锁被占用,如果没有被占用,就占用这个锁。 这个操作并不是原子的。 因此在实现的时候使用了
unsafe.compareAndSwapInt
方法。
2. 可重入锁包含公平锁
FairSync
和非公平锁
NonfairSync
两种:
. 公平锁: 先判断一下是否“公平”,即当前线程是否为等待队列中的第一个(等待队列为空或者队列中的第一个为当前线程),如果通过了公平的判断,则尝试去获取获取锁
compareAndSetState
. 非公平锁:省去了前面判断是否公平的步骤。
3.锁的占用和释放:
. 当前线程如果没有成功获取锁,则会加入到等待队列里面,并且阻塞当前线程, 阻塞的方式使用的是
LockSupport.park
,这个操作和
Object.wait()
效果类似,但是后者会依赖于一个Object,前者则没有这个约束,直接挂起当前线程,至于效率上的区别就不知道了,我猜想差不多的(都是native方法,需要看虚拟机的实现代码才知道)
. 锁的释放逻辑比较显而易见,最终调用
LockSupport.unpark
实现,与notify效果也类似。
4.读写锁
ReentrantReadWriteLock
:实际上定义了两种类型的锁,一种是share的,一种是排他的锁, 对于读操作来说,只有没有排他锁占用就可以了,但是对于排他锁来说,share锁和排他锁都没有占用的时候才能获取成功。
. 读锁:多个读锁请求过来以后都可以成功,增加引用计数,释放的时候减少引用计数;
. 写锁:和普通的可重入锁类似。
阅读心得:
1. 公平锁会多做一步公平性检查的步骤,因此要比非公平锁效率稍微低一些。但是非公平锁也有个缺点,就是有可能一个等待了许久的线程,被一个刚进来的线程先抢得了锁。 因为释放锁的操作里面,释放和唤醒下一个等待的线程并不是一个“同步” 的操作。
2. Lock和Unlock操作需要在同一个线程里面操作的,不同的线程会报错(因为等待队列是用线程来标识的,其他的线程做Unlock会导致不知道哪个线程发的释放锁请求)
3. LockSupport之前一直没用过,park和unpark作用是读了代码才知道,如果是简单的挂起线程的话,我觉得LockSupport要比wait合适。
分享到:
相关推荐
Java提供了多种同步机制,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`java.util.concurrent`包中的高级工具。`synchronized`关键字可以用于方法或代码块,确保同一时间只有一个线程...
- **互斥锁**:使用`synchronized`关键字或其他同步机制来控制线程对共享资源的访问。 #### 15. 标准I/O流与文件 Java提供了强大的I/O处理能力。 - **文件操作**:读取、写入、删除等操作。 - **跨平台性**:Java...
5. **多线程**:【99-102】源代码可能涵盖线程的创建、同步、锁机制,例如Thread类的使用,synchronized关键字的应用,以及volatile和ThreadLocal变量的理解。多线程编程是Java的一大特色,学习如何在并发环境中控制...
【Java高级部分代码注释及笔记】 在Java高级部分的学习中,我们主要涉及以下几个关键知识点: 1. **多线程**:Java提供了多种创建线程的方式,如继承Thread类、实现Runnable接口或Callable接口,以及使用...
对于多线程编程,书中有详细的教学,包括线程的创建、同步、锁机制(如synchronized关键字、Lock接口)以及并发工具类的使用。理解和掌握这部分内容对于开发高效的并发应用程序至关重要。 网络编程也是Java的一大...
Java是一种广泛使用的高级编程语言,由...在"java笔记javajava"这个压缩包中,可能包含了上述各个知识点的详细笔记和示例代码,对于学习和复习Java编程非常有帮助。通过深入阅读和实践,可以巩固和提升Java编程技能。
- `synchronized`关键字可实现锁机制,保证同一时刻只有一个线程执行特定代码块或方法。 - `volatile`关键字确保线程间变量的可见性,但不保证原子性。 - `wait()`, `notify()`和`notifyAll()`方法用于线程间通信...
### Java基础(韩顺平版)笔记详 #### 一、Java语言概述与环境搭建 - **Java的历史与发展** - Java由Sun Microsystems公司在1995年发布,由James Gosling领导开发。 - 2009年,Oracle公司收购了Sun Microsystems...
Java并发编程实践是Java...通过这些笔记,我们可以了解到Java并发编程中的关键概念和实践,对于理解和编写高效的并发代码具有极大的帮助。在实际开发中,需要根据具体需求灵活应用这些知识,以保证程序的稳定性和性能。
此外,还会涉及线程同步和锁的概念,如synchronized关键字和wait/notify机制。 12. **反射与注解**:反射机制允许在运行时动态获取类的信息并操作类的对象,注解提供了一种元数据,可以用于编译时和运行时的代码...
【Java并发学习笔记(二)——Synchronized关键字与ReentrantLock同步锁】 在Java多线程编程中,确保线程安全是非常重要的。Synchronized关键字和ReentrantLock是两种常见的同步机制,它们都用于保证线程的原子性、...
15. **多线程**:学习如何创建和管理线程,理解同步机制(synchronized关键字和锁),以及线程通信(wait()、notify()、notifyAll())。 16. **枚举与注解**:了解枚举类型和注解的用法,它们在代码规范和元数据...
在Java中,线程同步可以通过使用同步锁来实现,其中最常见的是`synchronized`关键字。 同步锁的引入是为了防止多个线程同时访问同一临界资源,从而避免数据竞争。例如,上述代码中的电话拨号案例展示了没有同步时...
你需要了解如何创建线程(通过Thread类或实现Runnable接口)、线程的生命周期、线程同步(如synchronized关键字、Lock锁、信号量等)以及死锁避免策略。这些知识对于编写高并发、高性能的Java应用至关重要。 最后,...
- **线程同步**:使用`synchronized`关键字或`ReentrantLock`等锁机制。 - **线程通信**:通过等待(wait)和通知(notify)机制。 ### 第六章:常用类API - **字符串处理**:`String`类和`StringBuilder`类。 - **日期...
根据给定的信息,我们可以从Java和Android学习笔记中提取出一系列重要的知识点,下面将逐一进行详细解释。 ### Java基础知识 #### 1. 命令行基础操作 - **`javacmd`**: 这个命令是Java命令行工具的一部分,用于...
线程同步和通信(如synchronized、wait/notify、锁等)是Java并发编程的核心内容。 这些知识点涵盖了JVM的基本概念和高级特性。通过深入研究和实践这些代码资源,开发者可以更好地理解和优化Java应用程序,提升系统...
以上知识点涵盖了压缩包中的文档内容,如《有答案java编程.doc》可能包含编程题目及解答,《CoreJava笔记.doc》可能涵盖核心Java概念,《有答案程序阅读题.doc》涉及代码阅读能力训练,《Review4Java(Anwser).doc》...
8. **JNI**:Java本地接口,允许Java代码调用C/C++函数。 二、Java EE(企业版) Java EE是用于构建企业级Web应用的平台,它在Java SE的基础上增加了许多服务和组件。关键知识点包括: 1. **Servlet**:HTTP请求...
6. **线程与并发**:探讨线程的基本概念、创建与管理,同步机制(如synchronized关键字、wait()、notify()、锁等),以及Java并发库(如ExecutorService、Future、Callable等)的使用。 7. **反射机制**:介绍如何...