本文首发在个人公众号:HelloWorldEE,欢迎关注。
本篇文章的来源是这样,有一天,我一同学面试某公司回来,和我分享其被问的相关面试题。其中就有一道关于Semaphore的面试题,个人觉得比较经典,分享出来供大家参考。
具体同学和面试官的对话还原出来是这样。
面试官:现在有一个方法task,希望只能被10个线程调用,利用Java相关类,应该如何来实现?
同学:使用Java中的Semaphore类来实现,当一个线程调用方法task之前先从Semaphore申请令牌,如果申请到了,则调用task方法,调用完之后释放令牌供其他的线程使用,如果没有,则阻塞等待。
面试官:Semaphore中申请令牌、释放令牌的方法叫什么?
同学:acquire、release方法
面试官:semaphore初始化有10个令牌,11个线程同时各调用1次acquire方法,会发生什么?
同学:拿不到令牌的线程阻塞,不会继续往下运行。
面试官.semaphore初始化有10个令牌,一个线程重复调用11次acquire方法,会发生什么?
同学:稍微有点蒙,因为考虑到了锁的重入问题,不知道令牌会不会和锁一样,是可以重入的。注:笔者留给大家思考,后面会给出答案。
面试官:semaphore初始化有1个令牌,1个线程调用一次acquire方法,然后调用两次release方法,之后另外一个线程调用acquire(2)方法,此线程能够获取到足够的