繁体   English   中英

具有属性和同步方法的静态类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM