前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一简单线程同步笔试题分享,欢迎纠错分享更多思路

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

原创
作者头像
小金狗子
修改2020-07-28 17:59:29
3970
修改2020-07-28 17:59:29
举报

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

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

有线程: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()无锁化处理,当然带来的代价是线程会有不必要的执行。以下是代码:

代码语言:java
复制
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();
    }
  }
}

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不知道出题人是否会对我分享该题有意见。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档