腾讯云海外购

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

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

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

有线程: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();     }   } }