如何在回调函数中使用synchronized?

时间:2016-07-24 20:55:22

标签: java multithreading callback synchronize

我试图学习如何使用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);
        }
    }
}

0 个答案:

没有答案