我有一个包含以下方法的课程
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上同步。 我阅读了教程和示例,但我仍然有这个问题。
答案 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
}
}
并允许更高的并发度