-2

我有一个具有以下方法的课程

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

这个Test类被不同的线程使用,它们将用自己的数据填充变量'l1'并将它们发送给接收者。如果我必须同步它以按顺序发送数据,以便接收者每次都获得一整帧数据(没有来自不同线程的数据混乱),我应该在“l1”上同步还是在 Test.class 上同步?我阅读了教程和示例,但我仍然有这个问题。

4

1 回答 1

0

您应该同步代表您“共享状态”的对象(在本例中为 l1);您必须确保每个插入/读取操作都是同步的,因此您必须有一个synchronized(l1) {...}用于add(and remove) 调用的块和一个在发送时的块:

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

根据您的要求,您还可以实现更复杂的东西,例如:

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
     }
}

并允许更大程度的并发

于 2015-06-11T10:44:38.707 回答