`
luliangy
  • 浏览: 96871 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java并发编程(二)--j.u.c锁机制

阅读更多

AQS

juc很多操作都是基于AQSAbstractQueuedSynchronizer

不同于自旋锁,juc使用的是volatile机制的状态变量;

内部也有一个阻塞线程的等待队列

每个线程都被封装在一个Node结点中

static final class Node {
        // 当前线程被取消
        static final int CANCELLED =  1;
        // 结点被移除队列时唤醒后继节点
        static final int SIGNAL    = -1;
// 结点在条件队列里面
        static final int CONDITION = -2;
        /**
         * waitStatus value to indicate the next acquireShared should
         * unconditionally propagate
         */
        static final int PROPAGATE = -3; 
        /** Marker to indicate a node is waiting in shared mode */
        static final Node SHARED = new Node();
        /** Marker to indicate a node is waiting in exclusive mode */
        static final Node EXCLUSIVE = null;
        
        volatile int waitStatus;
       
        volatile Node prev;
        volatile Node next;
        /**
         * The thread that enqueued this node.  Initialized on
         * construction and nulled out after use.
         */
        volatile Thread thread;
        Node nextWaiter;
        /**
         * Returns true if node is waiting in shared mode
         */
        final boolean isShared() {
            return nextWaiter == SHARED;
        }
        final Node predecessor() throws NullPointerException {
            Node p = prev;
            if (p == null)
                throw new NullPointerException();
            else
                return p;
        }
        Node() {    // Used to establish initial head or SHARED marker
        }
        Node(Thread thread, Node mode) {     // Used by addWaiter
            this.nextWaiter = mode;
            this.thread = thread;
        }
        Node(Thread thread, int waitStatus) { // Used by Condition
            this.waitStatus = waitStatus;
            this.thread = thread;
        }
}

 

 

等待锁时线程封装进入队列尾部或者成为唯一节点,锁释放时,队列头部节点出对;

 

Lock

可重入锁的设计

内部继承AQSSync类来实现锁相关操作,线程可以重复获得锁,内部计数器在每次获得锁时计数器加1,计数器变为0时,锁释放;

锁获取实现:acquire()方法先尝试一次tryAcquire操作,如果失败,则调用acquireQueue()方法把当前线程加入到同步队列中去,这个时候可能会反复的阻塞与唤醒这个线程,直到后续的tryAcquire操作成功。

锁释放实现:state值减1,然后判断锁是否被完全释放,如果被完全释放,则唤醒继任节点。

 

Condition

条件变量的实现,类似于OS中的信号量的实现,是实现BlockingQueue的基础,变量value>=0时表示有多少资源可以分配,当value<0时,表示欠缺多少资源,线程必须在等待队列中排队。

主要操作是await(),signal()

Signal()操作在资源可用时唤醒相应线程

Await()操作在资源不可用时线程必须等待

二者必须配对存在。

 

ReadWriteLock

读写锁的实现,读写锁分为读锁和写锁,读取数据必须获取读锁,可以存在多个读锁,但写锁必须只能存在一个,读锁写锁之间互斥。

Java读写锁在设计上采用volatile状态变量、CAS数据更新机制和条件变量结合的策略,获取读锁是,如果写锁被线程拥有,那么读者进入等待队列,否则可以获取锁,获取写锁时,如果读者仍持有锁,那么写者等待。

分享到:
评论

相关推荐

    JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS.docx

    ### JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS #### 引言 《JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS》是一篇详细介绍Java实用并发工具包(Java Util Concurrency,简称J.U.C.)中重要...

    java并发编程库

    Java并发编程库,特别是java.util.concurrent(简称J.U.C),是Java语言在多线程处理上的一大亮点。并发编程是一个复杂的话题,因为它涉及到许多高级概念,包括线程安全、死锁、性能优化和原子操作等。J.U.C正是为了...

    Java并发编程与高并发解决方案.txt

    Java.util.concurrent(简称J.U.C)是Java并发编程的核心库之一,提供了大量的并发容器和原子变量类,以及各种同步工具类。它简化了并发编程中的许多复杂细节,提高了开发效率和程序的稳定性。 ##### 4.2 原子类 J...

    Java并发编程与高并发解决方案之并发容器(J.U.C).docx

    ### Java并发编程与高并发解决方案之并发容器(J.U.C) #### 并发容器J.U.C 在Java中,为了提供高性能、低延迟的并发数据结构,Java提供了多种并发容器类,这些类主要位于`java.util.concurrent`包内,通常被称为J.U...

    J.U.C系列线程安全的理论讲解编程开发技术共6页.pdf

    Java并发编程是Java程序员需要掌握的关键技能之一,而J.U.C(Java Concurrency Utilities)是Java平台中的核心组件,提供了丰富的工具和接口来处理多线程环境中的并发问题。本资料"J.U.C系列线程安全的理论讲解编程...

    java并发编程与高并发解决方案.docx

    **J.U.C(Java Util Concurrency)**是Java并发编程的基石,包含各种线程安全的工具类,如`ExecutorService`,`Semaphore`,`CountDownLatch`等。 **高并发解决方案** 1. **扩容**:可以通过**水平扩容**(增加...

    JAVA并发编程中文完全版

    根据提供的文件信息,“JAVA并发编程中文完全版”这本书旨在为读者提供全面且深入的Java并发编程知识。下面将从以下几个方面来阐述此书所涵盖的关键知识点: ### 一、Java并发编程基础 #### 1.1 Java并发模型概述 ...

    Java 多线程与并发-Java并发知识体系详解.pdf

    Java并发编程是Java开发中的重要领域,涉及到多线程、并发控制、同步机制等多个知识点。以下是对Java并发知识体系的详细解析。 首先,我们要理解并发的理论基础。并发是为了提高系统资源利用率和处理能力,让多个...

    实战Java高并发程序设计-12333.pdf

    7. **J.U.C(Java并发工具包)**:这部分将详细介绍`java.util.concurrent`包中的各种工具类,如`Future`、`CompletableFuture`以及`ForkJoinPool`和`RecursiveTask`,它们是Java 7引入的并发处理框架,用于并行计算...

    JavaWeb并发编程与高并发解决方案.docx

    - J.U.C(Java Util Concurrency):Java并发工具包,提供多种并发控制工具类。 - AQS(AbstractQueuedSynchronizer):抽象队列同步器,许多并发工具的基础。 - ThreadLocal:线程局部变量,用于解决线程间的...

    深入浅出_Java并发工具包原理讲解

    Java并发工具包(J.U.C)是Java编程语言中用于并发编程的一系列工具包的统称,它包含了一系列方便实现多线程编程的类和接口,使得开发者可以更加方便地编写高效、线程安全的程序。本文将深入浅出地探讨J.U.C的原理和...

    多线程J.U.C框架(完整)

    `AbstractQueuedSynchronizer` 是Java并发框架中的核心抽象类,为多种同步工具(如锁、信号量、屏障等)提供了底层支持。AQS的设计目的是为了简化同步组件的实现难度,同时提高其性能表现。 ##### 设计理念 - **...

    Java并发编程的艺术源码

    《Java并发编程的艺术》是一本深入探讨Java平台上的并发编程技术的专业书籍,其源码提供了丰富的实例和示例,帮助读者理解并发编程的核心概念和最佳实践。在Java中,并发编程是开发高效、可扩展应用的关键技能,尤其...

    实战Java高并发程序设计(高清版)

    5. **J.U.C框架**:Java并发 utilities (J.U.C) 框架是Java并发编程的重要组成部分,书中会介绍如何利用这个框架来提升并发性能和代码的可读性。 6. **性能调优**:在高并发场景下,性能优化是必不可少的。可能涵盖...

    Java并发理论,如何理解线程安全.docx

    Java并发包(java.util.concurrent, J.U.C)提供了丰富的并发工具和容器,如ConcurrentHashMap、Semaphore、CyclicBarrier等,它们设计用于解决原子性、有序性和可见性问题,简化并发编程。 总之,理解和掌握Java...

    浅析Java_Concurrency

    为了避免这些常见的陷阱,Java并发编程的实践者需要对J.U.C的API有深入的理解,并熟悉其背后的硬件原理和软件设计思想。只有这样,才能在设计并发程序时做出正确的选择,合理地平衡性能和安全性,编写出既高效又可靠...

    深入浅出Java_Concurrency

    Java的并发编程模型在J.U.C(`java.util.concurrent`)包中得到了全面的展现,这不仅仅是Java语言本身的一大亮点,更是多线程编程领域的重要组成部分。本文旨在通过深入浅出的方式探讨J.U.C的关键知识点,为读者提供...

    java最新脑图.zip

    线程和并发处理是Java的强项,脑图可能涵盖了线程的创建、同步机制(如synchronized关键字、Lock接口)、并发工具类(如ExecutorService、Semaphore、CountDownLatch)以及并发设计模式。 Java还支持网络编程,提供...

    【Java核心知识面试】-15个顶级Java多线程面试题答案.zip

    Java多线程是Java编程中的...同时,面试中可能还会涉及到J.U.C(Java并发包)中的高级特性和最佳实践,例如CountDownLatch、CyclicBarrier、Semaphore等工具类的使用。熟悉并掌握这些内容,将有助于在面试中表现出色。

    1.第一章——java基本语法知识+常用快捷键.pdf

    - **支持多线程**:Java内置了对多线程的支持,可以轻松实现并发编程。 - **两大核心机制**: - **GC(Garbage Collection)**:自动垃圾回收机制,自动管理内存,避免程序员手动释放内存引发的问题。 - **Java...

Global site tag (gtag.js) - Google Analytics