在我的java应用程序中,我有一个字符串(MySingleton.getInstance().myString
),它会根据用户操作进行更新。在此应用程序中,有一个TCP服务器,只要字符串的值发生更改,就会将此字符串的值发送给所有连接的客户端。
每个客户端套接字都有自己的线程。这是线程代码。
public void run() {
try {
PrintStream printStream = new PrintStream(hostThreadSocket.getOutputStream(), true);
while (true) {
synchronized (MySingleton.getInstance()) {
printStream.println(MySingleton.getInstance().myString);
try {
MySingleton.getInstance().wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
以下是写入MySingleton.getInstance().myString
的代码。
public void updateString(String newString) {
synchronized (MySingleton.getInstance()) {
MySingleton.getInstance().myString = newString;
MySingleton.getInstance().notifyAll();
}
}
我不熟悉java中的同步,所以我对我的代码不太自信。任何人都可以注意到任何错误吗?
答案 0 :(得分:4)
如果\n
总是返回相同的对象,那应该没问题。
如果方法调用在不同的时间点返回不同的对象,那么由于在一个实例上进行同步,然后在另一个实例上调用wait或notify,可能会出现异常。此外,可能存在内存危险,因为您没有在正在访问/更新的对象上进行同步。