我试图学习如何使用synchronized来锁定回调函数的寄存器。以下是我的代码,其中run()
是register_callback()
函数。我使用synchronized锁定寄存器以避免一些回调函数不会在寄存器中调用,但它有时不起作用。
我的理解是run()
首先锁定寄存器l
并检测标志然后执行下一步。但是,有时,run()
会在l
中遍历注册l
后将值添加到printList()
,这意味着不会打印该值。
我应该如何更改代码以确保我可以回调所有这些ID?
import java.util.ArrayList;
import java.util.List;
public class TestThread extends Thread
{
public static List<Long> l = new ArrayList<>();
public static boolean flag = false;
@Override
public void run()
{
synchronized (l) {
if (!flag) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
l.add(Thread.currentThread().getId());
} else {
System.out.println(Thread.currentThread().getId());
}
}
}
public static void printList()
throws InterruptedException
{
flag = true;
for (long curr : l) {
System.out.println("list: " + Long.toString(curr) + " " + Integer.toString(l.size()));
}
}
public static void main(String[] args)
throws InterruptedException
{
TestThread t1 = new TestThread();
TestThread t2 = new TestThread();
TestThread t3 = new TestThread();
t1.start();
t2.start();
TestThread.sleep(5);
TestThread.printList();
t3.start();
TestThread.sleep(50);
System.out.println(l.size());
for (long curr : l) {
System.out.println(curr);
}
}
}