分享一道蚂蚁金服的面试题

简介: 随着nums的增大,Lock+Condition的运行时长比Semaphore越短。看起来Lock+Condition的性能更好些。

这是一道蚂蚁金服二面的编程题


题目:交替打印零与奇偶数


给定一个数nums,然后交替打印出奇偶数。输出的长度为2nums,

你应该:至少用两种方法实现,并分析出优劣势。


举例:

输入:nums = 3

输出: "010203"


这道题与我之前分享的另外一道比较像 题目在这里 :阿里面试题分享(二)

但实际上比那道要简单些。因为没有要求写几个线程。


第一种解法:Lock+Condition


package com.oho.alg;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintNums {
  public final Lock lock = new ReentrantLock();
  public Condition c0 = lock.newCondition();
  public Condition c1 = lock.newCondition();
  public int flag = 0;
  private void print0(int num) {
    lock.lock();
    try {
      for (int i = 1; i <= num; i++) {
        if (flag == 0) {
          System.out.print(0);
          flag = 1;
          c1.signal();
          c0.await();
        }
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
  private void print(int num) {
    lock.lock();
    try {
      for (int i = 1; i <= num; i++) {
        if (flag == 1) {
          System.out.print(i);
          flag = 0;
          c0.signal();
          if (i < num) {
            c1.await();
          }
        }
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
  public void printNumsWithNum(int num) {
    long start = System.currentTimeMillis();
    Thread t1 = new Thread(() -> print0(num));
    Thread t2 = new Thread(() -> print(num));
    t1.start();
    t2.start();
    try {
      t1.join();
      t2.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println();
    System.out.println("===============================================");
    System.out.println("运行时长: " + (System.currentTimeMillis() - start));
  }
  public static void main(String[] args) {
    new PrintNums().printNumsWithNum(10);
  }
}


第二种解法:Semaphore


package com.oho.alg;
import java.util.concurrent.Semaphore;
public class PrintNumsUseSemaphore {
  public Semaphore s1 = new Semaphore(1);
  public Semaphore s2 = new Semaphore(0);
  private void print0(int num) {
    try {
      for (int i = 1; i <= num; i++) {
        //获取信号量,s1 - 1
        s1.acquire();
        System.out.print(0);
        //释放信号量,s2 + 1
        s2.release();
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  private void print(int num) {
    try {
      for (int i = 1; i <= num; i++) {
        //获取信号量,s2 - 1
        s2.acquire();
        System.out.print(i);
        //释放信号量,s1 + 1
        s1.release();
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  public void printNumsWithNum(int num) {
    long start = System.currentTimeMillis();
    Thread t1 = new Thread(() -> print0(num));
    Thread t2 = new Thread(() -> print(num));
    t1.start();
    t2.start();
    try {
      t1.join();
      t2.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println();
    System.out.println("===============================================");
    System.out.println("运行时长: " + (System.currentTimeMillis() - start));
  }
  public static void main(String[] args) {
    new PrintNumsUseSemaphore().printNumsWithNum(10);
  }
}


优劣势的话,如果在比较小的数据量下看不出来,我用nums = 800000,进行了测试:

Lock+Condition
运行时长: 9588 毫秒
Semaphore 运行时长: 9013 毫秒


随着nums的增大,Lock+Condition的运行时长比Semaphore越短。看起来Lock+Condition的性能更好些。至于为什么,因为涉及到锁的原理,这里就不多了,需要大家去看看源码,翻翻资料了。

相关文章
|
1月前
|
Python
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
|
1月前
|
存储 Java Shell
【Python学习教程】Python函数和lambda表达式_6(1),2024蚂蚁金服面试题及答案
【Python学习教程】Python函数和lambda表达式_6(1),2024蚂蚁金服面试题及答案
|
1月前
|
NoSQL Java 关系型数据库
阿里P7Java最全面试296题:阿里天猫、蚂蚁金服含答案文档解析
阿里天猫、蚂蚁、钉钉面试专题题目加答案】 不会做别着急:文末有答案以及视频讲解,架构师资料 1. junit用法,before,beforeClass,after, afterClass的执行顺序 2. 分布式锁
|
1月前
|
消息中间件 缓存 NoSQL
记一次蚂蚁金服四面遭虐,面试水太深,过河的渡船你造好了吗?
有道无术,术可成;有术无道,止于道;以术识道,以道御术
|
1月前
|
存储 关系型数据库 MySQL
面试蚂蚁(P7)竟被MySQL难倒,奋发图强后二次面试入职蚂蚁金服
爱因斯坦说过“耐心和恒心总会得到报酬的”,我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在“我”身上实现了。 每一个程序员都拥有一座大厂梦,我也不例外,去年面试蚂蚁金服,竟然被MySQL问倒了,很多相关性的问题都没有答上来,才2面就凉凉了。回去之后也潜心复习了,准备了二战,如今终于进入了蚂蚁金服,被录用。
|
1月前
|
缓存 NoSQL 算法
远程三面蚂蚁金服,分享面试经历总结(已拿offer)
当前环境,很多公司都采取了远程办公,远程面试。有一说一,第一次远程面试,还是比较紧张的。
|
9月前
|
消息中间件 NoSQL Java
泪目!跳槽太不容易,蚂蚁金服三轮面试,四个小时灵魂拷问
本人是双非院校科班研究生,Java开发3年工作经验,以下是最近的面试总结: 先说下我的面试准备经历,为了保证自己简历有较大一定的概率通过筛选,我在2018毕业后面试了多家公司,去了一家上海一家小公司一直工作到今年5月。 和往年相比,今年的金三银四看上去不是那么顺利,可能和我的准备不足有关,但是令我惊讶的是第一家给我面试机会的公司竟然是阿里巴巴。一开始接到面试通知时,心情特别复杂,紧张又兴奋,阿里巴巴是出了名的深挖项目实战,实际上我项目部分是相对薄弱的。这次面试,一共三轮,共计四个小时左右,这三轮面试对我来说,简直是灵魂拷问,至于结局,往下看吧!
泪目!跳槽太不容易,蚂蚁金服三轮面试,四个小时灵魂拷问
|
10月前
|
消息中间件 NoSQL Java
四面蚂蚁金服,定级阿里P7,这份面试经验心得分享给你
在金九银十即将到来之际,大部分人也都准备好了这在两个月里谋得一份自己心仪的工作,奈何今年的2023有些特殊,肺炎肆虐,对我们的工作和生活都造成了极大的影响。那么,是不是这样,我们就不工作,不学习了呢?实际上,正是因为现在正值传染病毒传播期间,所以我们宅在家里好好学习是再好不过的。对于Java程序员来说,利用这两三个月的时间,好好学习,着手准备起来,等到疫情好转,开始面试时,也不至于胆怯。 本人也是准备了大半年,最终如愿以偿拿到阿里offer!
1118 0
|
前端开发 测试技术
深入解析价值25k的蚂蚁金服异步串行面试题
注:代码有错,请阅读原文。朋友去面试蚂蚁金服,遇到了一道面试题,乍一看感觉挺简单的,但是实现起来发现内部值得一提的点还是挺多的。
面试蚂蚁(P7)竟被MySQL难倒,奋发图强后二次面试入职蚂蚁金服
爱因斯坦说过“耐心和恒心总会得到报酬的”,我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在“我”身上实现了。 每一个程序员都拥有一座大厂梦,我也不例外,去年面试蚂蚁金服,竟然被MySQL问倒了,很多相关性的问题都没有答上来,才2面就凉凉了。回去之后也潜心复习了,准备了二战,如今终于进入了蚂蚁金服,被录用。