【问题标题】:Design pattern: How to create synchronized method or block in Singleton pattern in Java?设计模式:如何在 Java 中的单例模式中创建同步方法或块?
【发布时间】:2016-09-20 08:46:23
【问题描述】:

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

【问题讨论】:

  • 不应该用BackendServer的实例方法创建socket吗?如果它是服务器,那么从样式上讲,您不应该单独创建套接字。

标签: java singleton synchronized synchronized-block


【解决方案1】:

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

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

【讨论】:

  • @RealSkeptic。正确的。我错过了,谢谢。我会编辑答案。
  • 您好,感谢您的回复。我确实想在 BackendServer 对象上进行同步。你能告诉我一些如何在 Emitter.Listener 函数中实现这一点的代码吗?
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 2012-01-04
相关资源
最近更新 更多