设计模式:如何在Java中以Singleton模式创建同步方法或块?

时间:2016-09-20 08:46:23

标签: java singleton synchronized synchronized-block

我正在使用Java实现后端服务。我选择应用Singleton模式,因为应该只运行一个服务。但是,此服务也是一个Socket.IO客户端,因此必须在服务器推送时触发某种事件。但事件应该是synchronized在队列中。

我认为我的实施不正确。 Tt似乎synchronized(this)块不保护Backend对象而是保护Emitter.Listener对象。

private static synchronized BackendServer getInstance()
{
    if(instance == null) {
        instance = new BackendServer();
        try {
            socket = IO.socket(host_name+":"+port_frontend);
            socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                }
            }).on("event1", new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    try {
                        synchronized(this) { <--Which object is synchronized?
                            String timestamp = getCurrentTime();
                            String logging = "["+timestamp+"] ";

1 个答案:

答案 0 :(得分:3)

在您引用的行中,this确实是指Emitter.Listener个实例。因此,您要创建一个使用新Emitter.Listener实例作为监视器的同步块。这可能不是你想要的。如果要在另一个对象上进行同步,可以将其放在同步块中。

作为旁注,请注意同步块不会保护对象。它们确保同步块(或具有相同监视器的任何其他同步块)不会被不同的线程同时访问。如果同一个对象有其他非同步代码,则可以同时执行。