Java-线程并发(二)-队列同步器-AbstractQueuedSynchronizer

本文介绍了队列同步器的概念及其实现,详细解释了如何通过继承AbstractQueuedSynchronizer来构建自定义同步器,包括核心方法的重写以及如何使用自定义同步器实现Lock接口。

1、队列同步器概念

  • 队列同步器是用来构建锁的基础,它使用一个int变量表示资源的被锁状态,使用FIFO队列来控制线程对资源的加锁。即线程必须先进入队列等待,当资源空闲允许后才能对资源加锁。
  • 它提供线程安全地访问状态:
  • getState():获取状态
  • setState(int newState):设置状态
  • compareAndSetState(int expect,int update):使用CAS操作设置当前状态值
  • 支持共享、独占锁方式。

  •     共享锁:同一资源可被多个线程同时加锁。
  •     独占锁即是同一时刻只有一个线程可以对资源加锁,而其他线程只能等待;仅当该线程释放锁时,其他线程才可对资源加锁。
  • 仅提供5个可重写的方法
  • protected boolean tryAcquire(int arg):独占式获取同步状态,使用CAS操作设置同步状态
  • protected boolean tryRelease(int arg):独占式释放同步状态
  • protected int tryAcquireShared(int arg):共享式获取同步状态,返回值>=0表示成功
  • protected boolean tryReleaseShared(int arg):共享式释放同步状态
  • protected boolean isHeldExclusively():当前同步器是否在独占模式下被线程占用


2、自定义同步器

  • 实现一个同步器Sync,并继承AbstractQueuedSynchronizer抽象类。其重写3个方法,isHeldExclusively()、tryAcquire(int acquires)、tryRelease(int release)
  • 然后Mutex类实现Lock接口,以便我们对资源的加锁、解锁。注意到,实现Lock接口的函数中,我们是使用同步器的方法对资源加锁、解锁的。

public class Mutex implements Lock{

	private final Sync sync=new Sync();
	
	//对资源加锁
	@Override
	public void lock() {
		// TODO Auto-generated method stub
		sync.acquire(1);
	}

	//中断方式加锁
	@Override
	public void lockInterruptibly() throws InterruptedException {
		// TODO Auto-generated method stub
		sync.acquireInterruptibly(1);
	}

	//新建一个Condition队列
	@Override
	public Condition newCondition() {
		// TODO Auto-generated method stub
		return sync.newCondition();
	}

	//尝试获取锁
	@Override
	public boolean tryLock() {
		// TODO Auto-generated method stub
		return sync.tryAcquire(1);	//尝试对资源加锁
	}

	//以超时模式获取锁
	@Override
	public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
		// TODO Auto-generated method stub
		return sync.tryAcquireNanos(1, unit.toNanos(timeout));
	}

	//解锁
	@Override
	public void unlock() {
		// TODO Auto-generated method stub
		sync.release(1);	//对资源解锁
	}
	//是否被锁
	public boolean isLock(){
		return sync.isHeldExclusively();	//是否被独占
	}
	
	//是否有线程等待
	public boolean hasQueuedThreads(){
		return sync.hasQueuedThreads();		//队列中是否有线程
	}
	
	//自定义同步器
	private static class Sync extends AbstractQueuedSynchronizer{
		//是否被线程独占
		@Override
		protected boolean isHeldExclusively(){
			return getState()==1;	//state为1时表示出于占用状态
		}
		//当状态为0时获得锁
		@Override
		public boolean tryAcquire(int acquires){
			if(compareAndSetState(0,1)){
				setExclusiveOwnerThread(Thread.currentThread());	//设置当前线程独占
				return true;
			}
			return false;
		}
		//释放锁,将状态设置为0
		@Override
		public boolean tryRelease(int release){
			if(getState()==0)
				throw new IllegalMonitorStateException();
			setExclusiveOwnerThread(null);
			setState(0);
			return true;
		}
		//新建一个Condition队列,这个队列用于存放需等待资源的线程
		Condition newCondition(){
			return new ConditionObject();
		}
	
	}
}

3、AbstractQueuedSynchronizer源码分析

以后补上

内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,涵盖正向与逆向运动学求解、正向动力学控制,并采用拉格朗日-欧拉法推导逆向动力学方程,所有内容均通过Matlab代码实现。同时结合RRT路径规划与B样条优化技术,提升机械臂运动轨迹的合理性与平滑性。文中还涉及多种先进算法与仿真技术的应用,如状态估计中的UKF、AUKF、EKF等滤波方法,以及PINN、INN、CNN-LSTM等神经网络模型在工程问题中的建模与求解,展示了Matlab在机器人控制、智能算法与系统仿真中的强大能力。; 适合人群:具备一定Ma六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)tlab编程基础,从事机器人控制、自动化、智能制造、人工智能等相关领域的科研人员及研究生;熟悉运动学、动力学建模或对神经网络在控制系统中应用感兴趣的工程技术人员。; 使用场景及目标:①实现六自由度机械臂的精确运动学与动力学建模;②利用人工神经网络解决传统解析方法难以处理的非线性控制问题;③结合路径规划与轨迹优化提升机械臂作业效率;④掌握基于Matlab的状态估计、数据融合与智能算法仿真方法; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解运动学建模与神经网络控制的设计流程,关注算法实现细节与仿真结果分析,同时参考文中提及的多种优化与估计方法拓展研究思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值