我正在使用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+"] ";
答案 0 :(得分:3)
在您引用的行中,this
确实是指Emitter.Listener
个实例。因此,您要创建一个使用新Emitter.Listener
实例作为监视器的同步块。这可能不是你想要的。如果要在另一个对象上进行同步,可以将其放在同步块中。
作为旁注,请注意同步块不会保护对象。它们确保同步块(或具有相同监视器的任何其他同步块)不会被不同的线程同时访问。如果同一个对象有其他非同步代码,则可以同时执行。