[英]Static Class with attributes and synchronized methods
我知道在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
,以便所有操作都按顺序进行。 但是我认为会有更好的方法来做到这一点。 谢谢你的帮助。 :)
Thread a = new Thread(new OutgoingFileTransfer(new File("c:/.../file1"))).start();
Thread b = new Thread(new OutgoingFileTransfer(new File("c:/.../file2"))).start();
使用两个不同的OutgoingFileTransfer
对象创建两个不同的线程。 每个都有其自己的sendThisFile
版本并对其进行操作。 当多个线程同时作用于同一对象时,同步和锁定就起作用了。 在您的情况下,不存在争用情况的危险,这两个线程是独立的并且并行运行。
编辑:
Java中的静态类:
Java仅允许静态内部类,而不允许静态顶级类。 静态类不会使其中的所有内容都是静态的。 从Java教程中:
实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。
因此,静态类可以像任何其他类一样实例化,可以在任何其他类中加入静态和非静态成员,并且静态和非静态成员的行为与其他任何类一样。
因此,在您的情况下, sendThisFile
teo独立实例具有两个sendThisFile
独立属性。 在这种情况下,其行为与OutgoingFileTransfer
是顶级(因此是非静态)类的情况相同。
我认为问题的关键在于对嵌套类的static
限定符的误解。
您只能将嵌套在其他类中的那些类声明为static
类,这意味着
class A {
static class B {
}
}
外部类永远不能是静态的(在此示例中为A
)。 类的static
表示嵌套类不需要围绕它的外部类的实例 。 意思是如果B
是静态的,你可以做
A.B b = new A.B();
如果不是,则必须执行以下操作:
A a = new A();
A.B b = new a.B();
这与成员和方法的static
概念完全相反。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.