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

设计模式:如何在Java中以单例模式创建同步方法或块?,java,singleton,synchronized,synchronized-block,Java,Singleton,Synchronized,Synchronized Block,我正在使用Java实现一个后端服务。我选择应用Singleton模式,因为应该只有一个服务在运行。但是,此服务也是Socket.IO客户端,因此在推送服务器时一定会触发某种类型的事件。但事件应在队列中同步 我认为我的实现是不正确的。Tt似乎synchronized(此)块并没有保护后端对象,而是保护发射器.Listener对象 private static synchronized BackendServer getInstance() { if(instance == null) {

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

我认为我的实现是不正确的。Tt似乎
synchronized(此)
块并没有保护
后端
对象,而是保护
发射器.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+"] ";
private静态同步后端服务器getInstance()
{
if(实例==null){
实例=新的后端服务器();
试一试{
socket=IO.socket(主机名+“:”+端口前端);
socket.on(socket.EVENT_CONNECT,新的发射器.Listener(){
@凌驾
公共无效调用(对象…参数){
}
}).on(“event1”,新的发射器.Listener(){
@凌驾
公共无效调用(对象…参数){
试一试{

已同步(此){在您引用的行中,
这个
确实指的是
发射器.Listener
实例。因此,您正在创建一个同步块,它使用新的
发射器.Listener
实例作为监视器。这可能不是您想要的。如果您想在另一个对象上同步,可以将其放入同步块中


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

@realponsign.对。我错过了,谢谢。我将编辑答案。您好,谢谢您的回复。我确实希望在BackendServer对象上同步。您能否在e Emitter.Listener函数?套接字不应该由
BackendServer
的实例方法创建吗?如果它是服务器,那么就样式而言,您不应该单独创建套接字。