commit 2f40484b3284049fdb0eda97c5e352dc7ace5ea5
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Sep 15 10:33:17 2021 +0200

    Improve EffectMessageSender: ArrayList with explicit locking in place of a Vector.

diff --git a/src/main/java/org/distorted/library/message/EffectMessageSender.java b/src/main/java/org/distorted/library/message/EffectMessageSender.java
index 82ba4c7..985b43d 100644
--- a/src/main/java/org/distorted/library/message/EffectMessageSender.java
+++ b/src/main/java/org/distorted/library/message/EffectMessageSender.java
@@ -21,7 +21,7 @@ package org.distorted.library.message;
 
 import org.distorted.library.effect.Effect;
 
-import java.util.Vector;
+import java.util.ArrayList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
@@ -43,12 +43,14 @@ public final class EffectMessageSender extends Thread
       }
     }
 
+  private static final Object mArrayLock   = new Object();
   private static final Object mLock        = new Object();
-  private static Vector<Message> mList     = null;
+  private static ArrayList<Message> mList  = null;
   private static EffectMessageSender mThis = null;
   private static volatile boolean mNotify  = false;
-  private static int mNumStarts            = 0;
 
+  // debug only, to be removed later
+  private static int mNumStarts = 0;
   private static long mStartTime, mStopTime;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -69,7 +71,7 @@ public final class EffectMessageSender extends Thread
 
       if( mThis==null )
         {
-        mList = new Vector<>();
+        mList = new ArrayList<>();
         mThis = new EffectMessageSender();
         mThis.start();
         }
@@ -101,10 +103,15 @@ public final class EffectMessageSender extends Thread
      
     while(mThis!=null)
       {
-      while( mList.size()>0 )
+      synchronized(mArrayLock)
         {
-        tmp = mList.remove(0);
-        tmp.mListener.effectFinished(tmp.mEffectID);
+        int size = mList.size();
+
+        for(int i=0; i<size; i++)
+          {
+          tmp = mList.remove(0);
+          tmp.mListener.effectFinished(tmp.mEffectID);
+          }
         }
 
       synchronized(mLock)
@@ -131,11 +138,14 @@ public final class EffectMessageSender extends Thread
       {
       long id = effect.getID();
 
-      for(int i=0; i<numListeners; i++)
+      synchronized(mArrayLock)
         {
-        EffectListener listener = effect.removeFirstListener();
-        Message msg = new Message(listener,id);
-        mList.add(msg);
+        for(int i=0; i<numListeners; i++)
+          {
+          EffectListener listener = effect.removeFirstListener();
+          Message msg = new Message(listener,id);
+          mList.add(msg);
+          }
         }
 
       synchronized(mLock)
@@ -161,7 +171,7 @@ public final class EffectMessageSender extends Thread
       {
       if( mThis==null )
         {
-        if( mList==null ) mList = new Vector<>();
+        if( mList==null ) mList = new ArrayList<>();
         mThis = new EffectMessageSender();
         mThis.start();
         }
