English 中文(简体)
为什么在建筑商上制造一条新线是不好的做法? [重复]
原标题:Why it is bad practice to create a new thread on constructors? [duplicate]
This question already has answers here:
Closed 11 years ago.

Possible Duplicate:
Java: Why not to start a thread in the constructor? How to terminate?

I m used to run FindBugs on my code in order to find bugs or bad practice. Today it complains on the fact that I m starting a thread in a class constructor.

真的不好吗 你能解释一下为什么吗

如果我的课是最后的,至少安全吗?

<强度 > EDIT :

线条作为内部类执行, 它只使用主类开始时已经初始化的字段 :

public final class SingletonOuter {
    private static SingletonOuter ourInstance = new SingletonOuter();

    public static SingletonOuter getInstance() {
        return ourInstance;
    }

    private final SomeOtherClass aField;

    private SingletonOuter() {
        aField=new SomeOtherClass(); 
        thread=new InnerThread();
        thread.start();
    }

    private boolean pleaseStop;

    private synchronized boolean askedStop(){return pleaseStop;}
    public synchronized void stop(){
        pleaseStop=true;  
    }

    private final InnerThread thread ;
    private class InnerThread extends Thread{
        @Override public void run() {
            //do stuff with aField until askedStop()
        }
    }

}

<强度 > EDIT :

避免未来引入错误的可能性:

public final class SingletonOuter {
        private static SingletonOuter ourInstance

        public static SingletonOuter getInstance() {
            if (ourInstance==null){
                ourInstance= = new SingletonOuter();
                ourInstance.thread.start();
            }

            return ourInstance;
        }

        private final SomeOtherClass aField;

        private SingletonOuter() {
            aField=new SomeOtherClass(); 
            thread=new InnerThread();

        }
        ...
最佳回答

为什么在建筑商身上制造一条新线是不好的做法呢?

查找错误正在提醒您注意围绕物体构造的指令重新排序可能性问题。 虽然新对象的内存空间已经分配, 但无法保证在您启动 < code> Innerthread 时任何字段已经初始化。 虽然 < code> final 字段 将会在构建者完成之前初始化, 但是无法保证如果 < code> Innerthread 开始使用( 例如) < code> a Field 开始时, 它会被初始化。 Java 编译者这样做是出于性能原因。 它还可以将非最终字段的初始化移动到 < em> < / em > 完成后, 新的实例已被构建者返回 。

如果您在构建器中开始新线条, 那么就会出现线条与部分初始化对象打交道的可能性。 即使 thread. start () 是您构建器中的最后一个语句, 新线条可能正在由于重新排序而访问部分构建对象。 这是 Java 语言规范的一部分 。

有关此专题的一个很好的链接 : < a href="https://stackoverflow.com/ questions/84285/ calling-thread-start- inline-its-own- constructor > 调用线。 start () 在其构建者 内

它提到以下几点:

通过在构建器内启动,您可以保证违反爪哇记忆示范准则。请查阅>Brian Goetz s s Security Construction Technologies 了解更多信息。

<强>编辑:

由于您的代码正在启动一条新线, 正在访问 afield , 根据Java memory Model , 无法保证在线索运行时, afield 将会被正确初始化。

我建议的是,在您的类中添加一个 start () 方法,称为 thread.start () .start () 。这是一个更好的做法,使使用此类的其他类更明显地看到在构建器中创建线条。

问题回答

一般而言,你最好温柔地对待你建筑师的工作。

您的天体仍然处于无效状态, 所以您不想让任何人访问它。 当您从构建器启动线条时, 它很可能会引用正在构建的天体( 否则为什么是构建器启动它? ) 。 此引用将会指向一个无效天体, 当线条开始并生效后不久。 在那里立即存在可怕的种族条件的可能性 。

以下是有关文章的链接http://www.ibm.com/travelworks/java/library/j-jtp0618/index.html

每次您对课程进行即时处理时,您都会创建线条。线索费用昂贵,且很难测试。如果对许多对象进行即时处理,您会遇到性能问题,你应该考虑一个线索pool来设置线条数量的限制。此外,如果您很难对线条中发生的任何行为进行单位测试,您应该考虑一个线索pool来设置线条数量的限制。此外,如果您很难对线索中发生的任何行为进行单位测试。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签