Search code examples
javajava-threads

java multi threading - how to synchronise


I have a class with following method

public class Test {
    private List l1;
    public void send() {
         for (<type> x : l1) {
               //send to receivers and put a log in DB
          }
    }
}

This Test class is used by different threads which will fill the variable 'l1' with their own data and send them to receivers. If I have to synchronize this to send data sequentially so that receivers get one full frame of data every time(without jumbling of data from different threads), should I synchronize on 'l1' or synchronize on the class Test. I read the tutorials and samples but I still have this question.


Solution

  • You should synchronize on the object that represents you "shared state" (l1 in this case); you must ensure that every insert/read operation is synchronized so you must have a synchronized(l1) {...} block for add (and remove) call and one while sending:

    public void send() {
         synchronized(l1) {
             for (<type> x : l1) {
               //send to receivers and put a log in DB
             }
         }
    }
    

    depending on you requirements you can also implement something more complex like:

    public void send() {
         synchronized(l1) {
             List l2=new ArrayList(l1);
             //clear l1?
         }
         for (<type> x : l2) {
            //send to receivers and put a log in DB
         }
    }
    

    and allow a grater degree of concurrency