java 多线程 - 如何同步
java multi threading - how to synchronise
我有一个class,方法如下
public class Test {
private List l1;
public void send() {
for (<type> x : l1) {
//send to receivers and put a log in DB
}
}
}
这个测试 class 被不同的线程使用,它们将用自己的数据填充变量 'l1' 并将它们发送给接收者。
如果我必须同步它以顺序发送数据以便接收者每次都能获得一整帧数据(不会混淆来自不同线程的数据),我应该在 'l1' 上同步还是在 class 测试上同步.
我阅读了教程和示例,但我仍然有这个问题。
您应该在代表您的对象上同步 "shared state"(在本例中为 l1);您必须确保每个 insert/read 操作都是同步的
所以你必须有一个 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
}
}
并允许更大程度的并发
我有一个class,方法如下
public class Test {
private List l1;
public void send() {
for (<type> x : l1) {
//send to receivers and put a log in DB
}
}
}
这个测试 class 被不同的线程使用,它们将用自己的数据填充变量 'l1' 并将它们发送给接收者。 如果我必须同步它以顺序发送数据以便接收者每次都能获得一整帧数据(不会混淆来自不同线程的数据),我应该在 'l1' 上同步还是在 class 测试上同步. 我阅读了教程和示例,但我仍然有这个问题。
您应该在代表您的对象上同步 "shared state"(在本例中为 l1);您必须确保每个 insert/read 操作都是同步的
所以你必须有一个 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
}
}
并允许更大程度的并发