2016-07-09 66 views
0

此处显示的for循环在一个线程内运行。在同步块内部,一个线程写入某个文件。有几个不同的文件,所以编写者保存在一个数组中。我想在这里确定的是,没有两个不同的线程同时写入同一个文件。但是,他们可以写入不同的文件。我使用正确的参数与同步块吗?这是在Java中使用同步的正确方法吗?

for(Element e: elements) 
{ 
    int i = getWriterIndex(e) 
    writeri = writers(i) 
    synchronized(writeri) 
    { 
     // Write to corresponding segment 
     writers(i).write(e) 
     recordsWritten(i) += 1 
    } 
} 
+0

你可以包含包含这个'synchronized'块的方法吗? –

+0

我已经添加了它,不是方法,而是从其调用的那个循环。 – pythonic

+0

我不是专业人士,但是这种看起来像生产者 - 消费者,你的同步代码会阻止整个for循环,也许你想为每个文件使用一个队列,并将数据发送到相应的队列,这样他们可以在自己的线程中写入相应的文件中。再次,我不是专家,完全没有。 –

回答

1

虽然我认为这会起作用,但我强烈建议你避免使用同步。原因在于最终你在同步策略中严格要求是很常见的。正如其他人所说,这似乎是一个完美的队列用例。

如果你不想在大多数情况下使用队列(包括这个),我会建议使用锁来保持线程安全(通常为ReentrantReadWriteLock)。你可以找到一个例子here

在你的情况下,我会创建一个单一的锁定每个作家,并要求为了使用作家当前线程必须持有writelock。 (如果你只是写你可能使用简单的锁而不是ReentrantReadWriteLock。

1

是的,只要同步块仅访问用作锁的数据结构,您的同步代码将按预期工作。所以,在你的代码中,writeri不能被多个线程同时访问,所以它是线程安全的。

但是,你必须确保你不访问变量recordsWritten别的地方,因为这样你将有比赛条件。所以,理想情况下你也可以锁定这个变量(在你访问它的每个地方),或者你可以使用一些Java原语,例如AtomicInteger

相关问题