【发布时间】:2014-06-06 13:03:18
【问题描述】:
我知道 StackOverFlow 上有很多几乎相同的答案,但它们不符合我的需求。
给出以下代码示例:
(内部类)
static class OutgoingFileTransfer implements Runnable {
File sendThisFile;
outgoingFileTransfer(File sendThis) {
this.sendThisFile = sendThis;
}
@Override
public synchronized void run() {
//Send the file...
}
}
我知道,同步方法将锁定整个类,但前提是调用了 run() 方法。如果我执行以下操作:
Thread a = new Thread(new OutgoingFileTransfer(new File("c:/.../file1"))).start();
Thread b = new Thread(new OutgoingFileTransfer(new File("c:/.../file2"))).start();
难道线程 a 初始化 file1 并在进入同步方法之前,然后线程 b 中断,设置 file2 并加入 run() 方法?这意味着永远不会发送 file1。对吧?
有没有办法防止这种情况发生?
我知道便宜的方法:让所有东西都不是静态的,然后添加一个boolean iAmCurrentlySendingAFilePleaseWaitInTheQueueTillTheOtherFileTransferFinished,这样所有东西都可以按顺序进行。但我认为会有更好的方法来做到这一点。谢谢你的帮助。 :)
【问题讨论】:
-
我认为布尔值可能更具描述性,
iAmCurrentlySendingAFilePleaseWaitInTheQueueTillTheOtherFileTransferFinishedBecauseIfYouDontThenWeWillRunIntoConcurrencyIssuesAndThoseJustArentFun -
@Rogue:对不起,名字太长了。 :P
-
@Andres:如果类本身是静态的,那么方法也必须是静态的,还是我是假的?但无论如何,这是我的错。更改“静态”->“同步”
-
在我看来,如果你同步 Runnable#run() 那么你无论如何都会渲染整个事情。
-
如果类中没有其他同步方法,则使 run 方法同步是没有意义的。如果这是完整的定义,
synchronized修饰符就没有用了。此外,由于每个 OutgoingFileTransfer 对象都将由单个线程使用,因此不需要同步(除非这只是代码的一部分)。
标签: java multithreading synchronize