I’m curious if there are things in the standard class library that you find useful but not widely used.

  • koreth@lemm.ee
    link
    fedilink
    arrow-up
    5
    ·
    1 year ago

    Sometimes people who build low-level code with mutable state that’s shared across threads don’t know about some of the synchronization tools Java has. A lot of people know about synchronized, a lot of people know about semaphores, but fewer people seem to know about CountDownLatch and fewer still seem to have heard about Phaser. Those last two have saved me from having to implement my own synchronization code on a number of occasions.

    • JackbyDev@programming.devOPM
      link
      fedilink
      arrow-up
      2
      ·
      1 year ago

      Those sound useful. I haven’t had to do much cross-thread synchronization thankfully, but I have had to use a BlockingDeque to check that some events came and in the right order. The CountDownLatch and Phaser may have been better.

    • austin@programming.dev
      link
      fedilink
      English
      arrow-up
      1
      ·
      1 year ago

      I had never heard of Phaser, but it looks pretty cool. I just read Baeldung’s Guide to Phaser and correct me if I’m wrong, but doesn’t it kind of seem like a race condition (it could just be how they use it in the examples)?

      class LongRunningAction implements Runnable {
          private String threadName;
          private Phaser ph;
      
          LongRunningAction(String threadName, Phaser ph) {
              this.threadName = threadName;
              this.ph = ph;
              ph.register();
          }
      
          @Override
          public void run() {
              ph.arriveAndAwaitAdvance();
              try {
                  Thread.sleep(20);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              ph.arriveAndDeregister();
          }
      }
      

      then

      executorService.submit(new LongRunningAction("thread-1", ph));
      executorService.submit(new LongRunningAction("thread-2", ph));
      executorService.submit(new LongRunningAction("thread-3", ph));
      

      if ph.arriveAndAwaitAdvance(); is called before all of the LongRunningActions are initialized, won’t it proceed before it is supposed to?

      • pohart@lemmyrs.org
        link
        fedilink
        English
        arrow-up
        2
        ·
        1 year ago

        Your analysis looks right to me. If this were mine I’d initialize all three before submitting any.