【问题标题】:Why do i have to synchronized an ArrayList of Threads?为什么我必须同步一个 ArrayList 的线程?
【发布时间】:2014-08-30 17:43:55
【问题描述】:

所以我需要创建一个线程数组列表,但根据

Java - Filling an ArrayList of Threads with loop

看来我需要使用 synchronized 关键字,那么我的问题是:

如果我只在主线程上调用它,为什么我必须使用同步关键字?没有其他线程可以做同样的事情吗?

ArrayList<Thread> t = new ArrayList<Thread>();
for(int i=0;i<love.size();i++){
    BTConnection cbtc = love.get(i).btc;
    if(cbtc!=null){
        Communicate temp = new Communicate(cbtc);
        Thread ttemp = new Thread(temp);
        ttemp.start();
        t.add(ttemp);   
    }
}

此外,如果在我使用的代码下方:

for(int i=0;i<t.size();i++){
    t.get(i).join();
}

在第 i 个线程返回之前,for 循环是否停止,然后继续等待第 i+1 个线程?

【问题讨论】:

  • 您的问题的格式和表述都非常好。我认为这是你的第一个问题。请记住,语言标签可能是最重要的标签,以便遵循他们精通的语言标签的用户可以看到您的问题得到强调。
  • 如果两个或多个线程可以同时访问和修改同一个对象,您需要某种同步。在您的情况下,只有主线程知道t,从任何创建的Communicate 对象中都看不到它。你可能需要同步那些BTConnections,因为那些可以被主线程和创建的线程访问,但你必须做一些非常奇怪的事情(为什么要在多个线程中使用一个连接?)这实际上成为一个问题。
  • @MattiasBuelens 好吧,连接应该在循环的每次迭代中不断变化......我错了吗?
  • 这里不需要同步。如果您只想等待所有线程完成,请考虑使用 java.util.concurrent.CountDownLatch。您需要修改 Communicate 中的线程代码以在返回之前调用 latch.countDown()。
  • @user217354 是的,您当前的代码没有问题。我只是说,如果您以后要对这些连接执行其他操作(例如生成新线程对它们执行其他操作),您可能需要同步...呃,已经忘记它了:您的代码很好。 :-P

标签: java multithreading arraylist synchronized


【解决方案1】:

如果只有一个线程正在向其中添加值/从中读取,我看不出您需要同步线程列表的任何原因。至于第二部分,你是对的,join-call 将阻塞,直到i'th 线程完成,然后再等待下一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2021-05-08
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多