Java中的闭锁

闭锁

1.定义:

闭锁是一种同步工具,可以延迟线程直到其达到其终止状态。
例如:DOTA2中匹配等待点确定界面的设计,需要等待所有十个玩家都点就绪才能继续进行。其实也有些类似于之前CUDA编程中用到的 __syncthreads()方法去同步同一个块内的线程。

2.实现

CountDownLatch是一种灵活的闭锁实现。一般会把StartGate设置1,EndGate设置为nThreads。通过await()方法等待计数器减到0,countdown()方法执行计数器减法。

3.代码

书本TestHarness类
import java.util.concurrent.CountDownLatch;

public class TestHarness {
    public long timetasks(int nThreads, final Runnable task) throws InterruptedException {
        // init start from 1.
        final CountDownLatch startGate = new CountDownLatch(1);
        final CountDownLatch endGate = new CountDownLatch(nThreads);
        for (int i=0;i< nThreads;i++){
            Thread t = new Thread(){
                public void run(){
                    try{
                        startGate.await();//wait the startgate count down to zero, then run.
                        try{
                            task.run();
                        } finally {
                            endGate.countDown();
                        }
                    } catch (InterruptedException ignored){ }
                }
            };
            t.start();
        }
        long start = System.nanoTime(); //单位纳秒
        startGate.countDown();
        endGate.await();//wait the endGate count down to zero, then run.
        long end = System.nanoTime();
        return end - start;
    }
}

我写的测试类
public class Solution {
    public static void main(String[] args) throws InterruptedException {
        final Thread tt = new Thread(){
            @Override
            public void run() {
                System.out.println("Thread Id: " + this.getId());  //具体的方法,比如DOTA2中点击准备就绪的按键
            }
        };
        TestHarness bisuo = new TestHarness();
        long threadtime = bisuo.timetasks(100,tt);
        double ans = (double)threadtime / 1000000000;
        System.out.println("Thread time:" +ans + "s");
    }
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: AQS (AbstractQueuedSynchronizer) 是 Java 的一种用于实现同步器的抽象类。它提供了一种通用的机制,用于实现同步工具(如锁、信号量和闭锁),而不需要编写底层同步代码。AQS 实现了一个队列,用于在多个线程之间安全地传递同步状态。 ### 回答2: AQS(AbstractQueuedSynchronizer,即抽象队列同步器)是Java用于实现同步机制的基础类。它提供了一种在同步状态下等待/通知的机制,并支持独占和共享两种同步方式。 AQS基于一个先进先出(FIFO)的双向队列,被称为等待队列,来存储等待获取同步状态的线程。每个线程在申请获取同步状态时会被加入到等待队列的尾部,同时被阻塞。当同步状态可用时,只有队列头部的线程才能获取到同步状态,并被唤醒继续执行。 AQS采用了模板方法设计模式,提供了独占模式下的acquire和release方法以及共享模式下的acquireShared和releaseShared方法。具体的同步实现逻辑由子类来实现。 在AQS,同步状态(state)是通过一个int类型的变量来表示,而具体的同步语义由子类的实现方法来定义。AQS利用CAS(Compare and Swap)操作来保证同步状态的原子操作,这也是保证AQS实现的线程安全性的基础。 除了同步的基本功能,AQS还提供了一些扩展方法,如条件队列的支持,子类可以通过实现Condition接口来创建自己的条件队列。 总之,AQS是Java基于队列的同步控制机制的基础类,它通过一种等待/通知的机制实现线程间的同步和通信,提供了独占模式和共享模式的支持,是Java并发编程非常重要的一个类。 ### 回答3: AQS (AbstractQueuedSynchronizer) 是 Java 用于构建同步器的基础框架。它提供了一套简单且灵活的实现方式,可用于构建各种类型的同步器,如锁、信号量、倒计时门栓等。 AQS 的核心是一个等待队列,用于管理等待获取同步状态的线程。它通过内部的 node 对象来表示每个线程,并使用 CAS 操作来实现线程的安全操作。当一个线程需要获取同步状态时,它会在等待队列插入一个 node,并进入自旋或阻塞等待其他线程的唤醒。当某个线程释放同步状态时,AQS 会将状态转移给队列的下一个等待线程。 AQS 为具体的同步器提供了两种操作:获取同步状态和释放同步状态。获取同步状态的方式一般有两种:独占方式 (Exclusive) 和共享方式 (Shared)。独占方式是指同一时间只能有一个线程获取同步状态,如 ReentrantLock;共享方式是指多个线程可以同时获取同步状态,如 CountDownLatch。 AQS 的实现基于模板方法设计模式,使用了一个 state 成员变量来表示同步状态。具体的同步器需要继承并实现 AQS 的抽象方法,包括获取同步状态的方法 (tryAcquire、tryAcquireShared) 和释放同步状态的方法 (tryRelease、tryReleaseShared)。通过重写这些方法,可以定制实现特定的同步逻辑。 总而言之,AQS 是 Java 用于构建同步器的基础框架,通过等待队列和内部的 node 对象来管理线程的获取和释放同步状态。它提供了一套简单且灵活的实现方式,并支持独占和共享两种同步方式。通过继承并实现 AQS 的抽象方法,可以定制实现各种类型的同步器。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值