专栏首页用户7113604的专栏一简单线程同步笔试题分享,欢迎纠错分享更多思路
原创

一简单线程同步笔试题分享,欢迎纠错分享更多思路

不知道出题人是否会对我分享该题有意见。

-------------------------

有线程:worker1、worker2 ,work1只能累加奇数、work2累加偶数,

请写出代码,实现两个线程交替累加至99中断,最终输出结果类似:

worker1:1+3=4 (奇数)

worker2:2+4=6 (偶数)

worker1:4+5=9(奇数)

worker2:6+6=12 (偶数)

(如果work1、work2其中一个线程累计和大于等于99时整体中断,并输出对应线程名及总和)

严格意义我并不觉得和线程同步相关。

个人在做题时答的稀烂,当然并不是不会。思路是有的,但是细节没有考虑好。作为java码农,没了IDE,纯手写也是头大。

出题人本意是希望用wait()/notify()来。我觉得还是偏复杂了。

在答题时我选择了用permits为1的Semaphore来实现。相对来说更简单。其中有一点没有考虑到的优化是要指定Semaphore

用公平锁。昨天想起来这题其实可以用Thread.yield()无锁化处理,当然带来的代价是线程会有不必要的执行。以下是代码:

public class WorkSum {
  static volatile int step=1;
  static volatile boolean run=true;
  public static void main(String[] args){
    new Thread(()-> work("work1",(Integer a)-> a%2!=0)).start();
    new Thread(()-> work("work2",(Integer a)-> a%2==0)).start();
  }
  static void work(String name, Function<Integer,Boolean> checker){
    int sum=0;
    while(run&&sum<99){
      if(checker.apply(step)){
        System.out.println(name + " add "+ sum + "+" + step +"="+(sum+step));
        sum+=step;
        if(sum>=99){
          run=false;
          System.out.println(name + " get Sum"+ sum);
          break;
        }
        step++;
      }
      Thread.yield();
    }
  }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java ClassLoader加载class过程

    关于class loader有太多太多的文章和图来讲过程。我就不多说了。以下是我认为的一些要点。

    小金狗子
  • ReentranReadWriteLock源码浅析

    c指的AbstractQueuedSynchronizer的state。SHARED_UNIT为65536。

    小金狗子
  • ReentranLock源码浅析

    常用的lock方法具体实现是在FairSync和NonfairSync。Nonfaire体现在lock时尝试直接获取锁,如果获取失败,则使用和公平锁一样通过Ab...

    小金狗子
  • 肿瘤分析中的OncoMap究竟为何物

    这里的Oncomap究竟是什么呢?查询了很多结果之后发现,OncoMap其实是一种肿瘤体细胞突变检测平台,该技术最早在2009年由Laura E. MacCon...

    生信修炼手册
  • Nginx多个子域名映射到不同的端口或 ip

    我决定采用采用 子域名区分服务 的方式,然后使用 nginx 做反向代理,分发到不同的端口。

    Java架构师历程
  • Junit 多线测试 问题

    java404
  • NeurIPS 2018 今日开幕,7 场大会演讲抢先看!

    AI 科技评论消息,作为人工智能 & 机器学习领域历史最悠久的学术会议之一,NeurIPS 2018 今年可说是花边不断,先是 9 月份开售的正会门票在 11 ...

    AI科技评论
  • 在SAP Hybris commerce Storefront里购物下单

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    Jerry Wang
  • LeetCode 1552. 两球之间的磁力

    在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位...

    Yano_nankai
  • JDK提供的并发工具类

    await(),进入等待的状态 countDown(),计数器减一 应用场景:启动三个线程计算,需要对结果进行累加。

    Dream城堡

扫码关注云+社区

领取腾讯云代金券