`
dwj147258
  • 浏览: 194679 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

通过AbstractQueuedsynchronizer实现共享锁

 
阅读更多

一、AbstractQueuedSynchronizer就不多说了,Lock就是基于它来实现锁的功能的,而AbstractQueuedSynchronizer底层则是通过cas操作来实现。

     通过AbstractQueuedSynchronizer来实现共享锁其实很简单,只需要对AbstractQueuedSynchronizer的状态进行控制就行了,其他的AbstractQueuedSynchronizer都做好了封装,举个例子吧。

package com.pinnet.test;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class ShareLock implements Lock {
	private Syn sync = new Syn(5);

	/**
	 * 在同步装置内部实现一个AbstractQueuedSynchronizer的子类
	 * 
	 */
	private static final class Syn extends AbstractQueuedSynchronizer {
		private static final long serialVersionUID = 5854536238831876527L;
		//构造方法,同时进入的线程数量必须为整数
		Syn(int count) {
			if (count <= 0) {
				throw new IllegalArgumentException("count must large than zero.");
			}
			//设置AQS的状态为count
			setState(count);
		}
		
		/**
		 * 加锁的时候会调用此方法,redececount参数为改变的状态数量,一般传1即可
		 */
		public int tryAcquireShared(int reduceCount) {
			//加锁和释放的方法都必须要放在循环中,避免失败的操作
			for (;;) {
				//获取当前的状态
				int current = getState();
				//计算过后的状态
				int newCount = current - reduceCount;
				//如果新的状态小于0 则返回值,在AQS的doAcquireShared方法中,如果返回的值小于0,则会将该线程封装为node放入队列
				//如果大于0 表示该线程能执行则线程会继续执行不受影响
				if (newCount < 0 || compareAndSetState(current, newCount)) {
					return newCount;
				}
			}
		}

		public boolean tryReleaseShared(int retrunCount) {
			for (;;) {
				int current = getState();
				int newCount = current + retrunCount;
				if (compareAndSetState(current, newCount)) {
					return true;
				}
			}
		}
	}
	public void lock(){
		sync.acquireShared(1);
	}
	public void lockInterruptibly() throws InterruptedException{
		sync.acquireSharedInterruptibly(1);
	}
	public boolean tryLock(){
		return sync.tryAcquireShared(1)>=0;
	}
	public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
		return sync.tryAcquireSharedNanos(1, unit.toNanos(time));
	}
	public void unlock(){
		sync.releaseShared(1);
	}
	public Condition newCondition(){
		return null;
	}
}

 注释很清楚,具体的可以看AbstractQueuedSynchronizer实现,其实都是很简单地

 

分享到:
评论

相关推荐

    java锁详解.pdf

    1. 锁的原理:ReentrantLock 锁是基于 AQS(AbstractQueuedSynchronizer)机制来实现的。 2. 锁的分类:ReentrantLock 锁可以分为公平锁和非公平锁两种。 3. 公平锁:公平锁是 ReentrantLock 锁的一种实现方式,确保...

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    一、AQS(AbstractQueuedSynchronizer)基础同步器的设计与实现 AQS是Java并发包中用于构建锁和同步组件的核心抽象类,它基于一种FIFO(先进先出)的等待队列机制。AQS维护了一个int类型的state字段,用于表示资源的...

    Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)

    而在共享模式下,多个线程可以同时获取资源,允许多个线程共享锁。AQS的典型应用如CountDownLatch、Semaphore等就是基于共享模式实现的。 在共享模式下,获取锁有三种方式,与独占模式类似,包括不响应线程中断获取...

    深入学习Java同步机制中的底层实现

    本文将深入探讨这些机制的底层实现,特别是通过`AbstractQueuedSynchronizer`(AQS)来理解`ReentrantLock`和`CountDownLatch`的工作原理。 首先,`ReentrantLock`是一个可重入互斥锁,允许同一个线程多次获取锁,...

    Java并发系列之AbstractQueuedSynchronizer源码分析(概要分析)

    AQS通过维护一个共享的、可同步的状态(`state`)来实现锁和其他同步原语。它提供了一个基础框架,使得子类能够定义如何根据状态来管理线程的等待和唤醒。 **2. AQS的“密码锁”——同步状态** AQS的核心是`state`...

    Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)

    其设计思想是利用一个整型变量来表示同步状态,通过原子操作(CAS)来保证线程安全地修改这个状态,从而实现锁和其他同步组件的底层支持。通过学习AQS,开发者可以更好地理解和使用Java并发库中的高级同步工具,如...

    ReentrantLock 实现原理 1

    ReentrantLock 的实现原理基于 AQS(AbstractQueuedSynchronizer),是一个重入锁,允许一个线程反复地获取锁而不会出现自己阻塞自己的情况。 ReentrantLock 的构造方法可以指定锁的类型,包括公平锁和非公平锁。...

    Java同步框架AbstractQueuedSynchronizer详解

    开发者可以通过继承AQS来实现自己的同步器,例如实现一个互斥锁、读写锁、信号量等。 AQS的实现原理是基于队列的数据结构,每个线程都可以被看作是一个节点,节点之间可以形成队列。AQS通过对队列的操作来实现同步...

    7、深入理解AQS独占锁之ReentrantLock源码分析(1).pdf

    它提供了一套完整的机制来实现独占锁、共享锁等功能。AQS的核心在于维护了一个volatile int类型的state变量,并提供了getState()、setState()、compareAndSetState()三个方法来操作这个state变量。 ### 二、AQS原理...

    一文带你看懂Java中的Lock锁底层AQS到底是如何实现的.doc

    其中,AbstractQueuedSynchronizer (AQS) 是Lock实现的核心组件,它为锁和其他同步构建块提供了基础框架。AQS是一个抽象类,它使用一个整型的`state`字段来表示资源的状态,并维护了一个FIFO(先进先出)的等待队列...

    java进阶提高学习教程-14锁机制.pptx

    在 Java 中,锁有多种不同的实现机制,如可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、锁消除、独享锁、共享锁等。 可重入锁 可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然...

    聊聊锁的那些事

    其中,ReentrantLock是基于AbstractQueuedSynchronizer(AQS)实现的,AQS是一个用来构建锁和其他同步器的框架,它利用一个int成员变量表示状态,并通过内置的FIFO队列来管理线程的排队工作。 sun.misc.Unsafe是...

    基于JDK源码解析Java领域中的并发锁,我们需要特别关注哪些内容?

    读锁通过获取一个时间戳来标记,若未发生写操作,读操作无需同步,从而提高性能。 5. **CountDownLatch**: - **设计思想**:用于一次性阻塞一组线程,直到某个事件完成,然后所有线程可以继续执行。 - **实现**...

    java并发之ASQ

    2. 共享锁:允许多个线程同时持有,如ReentrantReadWriteLock的ReadLock、CyclicBarrier、CountDownLatch和Semaphore。 在实际使用中,例如ReentrantLock的lock()方法,实际上是调用acquire()来尝试独占式获取锁。...

    Java面试题并发部分.docx

    可重入锁通过内部的计数器实现,每当一个线程获取锁时,计数器加1,释放锁时减1。当计数器为0时,表明所有锁都已经释放。 7. **公平锁与非公平锁**: - **公平锁**:线程按照申请锁的顺序获取,遵循先来后到原则...

    Java concurrency之锁_动力节点Java学院整理

    同步锁是Java 1.0就引入的原生锁机制,主要通过`synchronized`关键字实现。它的核心原则是互斥性,即同一时间只有一个线程能持有同步锁并执行相应的代码块。同步锁有两种形式:方法同步和代码块同步。同步锁的实现...

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

    比如Lock接口及其实现ReentrantLock,提供了比synchronized更灵活的锁机制,同时AQS(AbstractQueuedSynchronizer)是实现各种锁的基础同步器,它管理着一系列的等待线程,并提供一种框架来实现独占锁和共享锁。...

    aqs_demo.rar

    在具体实践中,AQS常用于实现独占锁和共享锁,如ReentrantLock。ReentrantLock提供了公平锁和非公平锁两种模式,公平锁保证了等待最久的线程优先获得锁,而非公平锁则更注重性能,可能让等待时间短的线程优先获取。...

    Java并发编程解析 | 解析AQS基础同步器的设计与实现

    基于JDK层面的锁主要可以分为四种方式,其中AbstractQueuedSynchronizer(AQS)是Java SDK并发包中主要的同步器实现。 AQS是Java中解决同步和互斥问题的基础同步器,通过Lock和Condition两个接口来实现管程。Lock...

Global site tag (gtag.js) - Google Analytics