java多线程 - 如何同步

时间:2015-06-11 10:33:30

标签: java java-threads

我有一个包含以下方法的课程

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上同步。 我阅读了教程和示例,但我仍然有这个问题。

1 个答案:

答案 0 :(得分:0)

您应该在代表您的对象上进行同步&#34;共享状态&#34; (在这种情况下为l1);您必须确保每个插入/读取操作都是同步的 因此,synchronized(l1) {...}(以及add)来电时必须有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
     }
}

并允许更高的并发度