3

我正在使用 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+"] ";
4

1 回答 1

3

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

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

于 2016-09-20T08:55:38.553 回答