Java 创建单例时出现问题

Java 创建单例时出现问题,java,Java,我正在尝试创建一个Singleton类,该类将从另外两个类访问。有人能告诉我以下代码有什么问题吗?我就是搞不懂 import java.util.LinkedList; public class MessageQueue { private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();; private static Messag

我正在尝试创建一个
Singleton
类,该类将从另外两个类访问。有人能告诉我以下代码有什么问题吗?我就是搞不懂

import java.util.LinkedList;

public class MessageQueue {

    private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();;

    private static MessageQueue messageQueue = null;

    /** A private Constructor prevents any other class from instantiating. */
    private MessageQueue() {
    }

    /** Static 'instance' method */
    public static MessageQueue getInstance() {
        if (MessageQueue.messageQueue == null) {
            System.out.println("Creating MessageQueue instance.");
            MessageQueue.messageQueue = new MessageQueue();
        }
        return MessageQueue.messageQueue;
    }

    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }
}
没有错误,但是

System.out.println("Creating MessageQueue instance.");
每次我都会被处决

MessageQueue messageQueue = MessageQueue.getInstance();
编辑1

import java.util.LinkedList;

public class MessageQueue {

    private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();;

    private static final MessageQueue messageQueue = new MessageQueue();

    /** A private Constructor prevents any other class from instantiating. */
    private MessageQueue() {
        System.out.println("problem...");
    }

    /** Static 'instance' method */
    public static MessageQueue getInstance() {
        return MessageQueue.messageQueue;
    }

    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }
}
import java.util.LinkedList;
公共类消息队列{
私有静态最终LinkedList队列=新LinkedList();;
private static final MessageQueue MessageQueue=new MessageQueue();
/**私有构造函数阻止任何其他类实例化*/
私有消息队列(){
System.out.println(“问题…”);
}
/**静态“实例”方法*/
公共静态MessageQueue getInstance(){
返回MessageQueue.MessageQueue;
}
公共对象克隆()引发CloneNotSupportedException{
抛出新的CloneNotSupportedException();
}
}

最好像这样定义和实例化singleton对象:

MessageQueue messageQueue = MessageQueue.getInstance();
private static final MessageQueue messageQueue = new MessageQueue();
然后,
getInstance
将只是:

public static MessageQueue getInstance() {
   return MessageQueue.messageQueue;
}

通过这种方式,您的单例对象将被实例化,并且将是线程安全的,因为它是由类加载器创建的。

首先,您没有指定任何错误。如果你想得到帮助,你应该给我们尽可能多的信息

其次,在Java中创建singleton的最好方法是:

public enum MySingleton {
    INSTANCE;

    //whatever methods you want to implement
}

您可以这样访问它:
MySingleton.INSTANCE.which()

如果您这样做的话会更容易

public class MessageQueue {

    private static final MessageQueue INSTANCE= new MessageQueue();

    public static MessageQueue getINSTANCE() {
        return INSTANCE;
    }

    private MessageQueue() {
    }
}

发生了什么错误?我所能看到的是这里有两个分号:

private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();;
private static final LinkedList queue=new LinkedList();;

一个线程安全的较短版本

public enum MessageQueue {
    INSTANCE;

    private final Queue<ServerDataEvent> queue = 
        new ConcurrentLinkedQueue<ServerDataEvent>();    

    public void addEvent(ServerDataEvent event) { queue.add(event); }
}
公共枚举消息队列{
例子
专用最终队列=
新建ConcurrentLinkedQueue();
public void addEvent(ServerDataEvent事件){queue.add(event);}
}

公共枚举消息队列{
;
专用静态最终队列=
新建ConcurrentLinkedQueue();
publicstaticvoidaddevent(ServerDataEvent事件){queue.add(event);}
}
最简单的方法:

private static final MessageQueue messageQueue = new MessageQueue();

public static MessageQueue getInstance() {
   return MessageQueue.messageQueue;
}

这里的错误是你的第一句话:我试图创建一个ton类,它将从另外两个类实例化。-你看到问题了吗?似乎单身不是你想要的。是否发生了错误?是否未创建单例?这不是线程安全的。此外,问题标题中提到的问题是什么?singleton的逻辑似乎是正确的。你看到什么问题了?您是否遇到编译时错误,或者逻辑不适合您?代码的基础看起来不错,但事实上它不是线程安全的。你遇到了什么问题?没有得到一个实例?其他?没有错误,但是
System.out.println(“创建MessageQueue实例”)MessageQueue=MessageQueue.getInstance()时,就会执行code>@Michael J.Lee:非常感谢,意识到输入错误并修复:)@anubhava:我照你说的做了。但我还添加了一个简单的
System.out.println(“内部构造函数”)构造函数中的行。在此之后,如果我执行
MessageQueue=MessageQueue.getInstance()
从两个不同的类中,我可以同时看到构造函数中的
。这是预期的吗?谢谢。请注意,如果创建实例会引发异常,那么由线程加载程序创建实例可能会导致问题。如果这样做,那么类将无法加载,错误消息将。。。对于使用你的类的人来说没有什么用处(即,你只是收到一条消息,它无法加载任何这样的类)。@Bhushan:你是否像我上面建议的那样更改了你的
getInstance()
方法?正如您所看到的,构造甚至不再在
getInstance()
中发生,因此无论您调用
getInstance()
多少次,它都不应该在构造函数内部打印
。@RHSeeger:这是一个有效的观点。除此之外,另一种无法使用加载程序创建的
实例的情况是,构造函数需要传递一些运行时参数。
private static final MessageQueue messageQueue = new MessageQueue();

public static MessageQueue getInstance() {
   return MessageQueue.messageQueue;
}