Java 我的代码是线程安全的吗?
在java应用程序中,我有一个字符串(Java 我的代码是线程安全的吗?,java,multithreading,Java,Multithreading,在java应用程序中,我有一个字符串(MySingleton.getInstance().myString),它根据用户操作进行更新。在这个应用程序中,有一个TCP服务器,只要字符串的值发生变化,它就会将该字符串的值发送给所有连接的客户端 每个客户端套接字都有自己的线程。这是线程代码 public void run() { try { PrintStream printStream = new PrintStream(hostThreadSocke
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中的同步,所以我对我的代码不太有信心。有人注意到有什么错误吗?如果
MySingleton.getInstance()
总是返回相同的对象,那么应该没有问题
如果方法调用在不同的时间点返回不同的对象,那么您可能会因为在一个实例上同步,然后在另一个实例上调用wait或notify而出现异常。此外,可能存在内存危险,因为您没有在正在访问/更新的对象上进行同步。如果
MySingleton.getInstance()
始终返回相同的对象,则应该可以
如果方法调用在不同的时间点返回不同的对象,那么您可能会因为在一个实例上同步,然后在另一个实例上调用wait或notify而出现异常。此外,可能存在内存危险,因为您没有在正在访问/更新的对象上进行同步。压力测试(可能有几个线程试图访问变量)是否会对字符串产生任何奇怪的结果?压力测试只会证明存在错误,而不是没有错误。在这种情况下,需要对代码进行详细检查。忘记自己进行同步/锁定。由于您刚刚获得并设置了一个值,我们只需要一个原子引用@StephenC是的,我完全同意,我应该更清楚地阐述。我只是说,如果测试会产生一个奇怪的结果,那将是一个种族状况的明确指示。但是,是的,bug有时确实隐藏得很微妙=)您没有向我们展示足够的代码。
hostThreadSocket
在哪里声明?MySingleton.getInstance()看起来像什么?压力测试(可能有几个线程试图访问变量)是否会对字符串产生任何奇怪的结果?压力测试只会证明存在错误,而不是没有错误。在这种情况下,需要对代码进行详细检查。忘记自己进行同步/锁定。由于您刚刚获得并设置了一个值,我们只需要一个原子引用@StephenC是的,我完全同意,我应该更清楚地阐述。我只是说,如果测试会产生一个奇怪的结果,那将是一个种族状况的明确指示。但是,是的,bug有时确实隐藏得很微妙=)您没有向我们展示足够的代码。hostThreadSocket
在哪里声明?MySingleton.getInstance()看起来像什么?…前提是MySingleton.getInstance()始终返回相同的对象。这是一个很大的假设,在多线程环境中安全地构建一个单例对象是无数新手在过去搞砸的事情。另外,如果您不知道在哪里声明了hostThreadSocket
,并且您甚至没有提到这个程序片段如何错误地使用wait()
和notifyAll()
“这是一个很大的假设”——确切地说。这就是为什么我1)说出它,2)说明如果假设不正确会发生什么。(参见第2段。)@jameslarge您能否提及这里如何误用wait()
和notifyAll()
?…前提是MySingleton.getInstance()始终返回相同的对象。这是一个很大的假设,在多线程环境中安全地构建一个单例对象是无数新手在过去搞砸的事情。另外,如果您不知道在哪里声明了hostThreadSocket
,并且您甚至没有提到这个程序片段如何错误地使用wait()
和notifyAll()
“这是一个很大的假设”——确切地说。这就是为什么我1)说出它,2)说明如果假设不正确会发生什么。(参见第2段。)@jameslarge您能不能提到这里是如何误用wait()
和notifyAll()
?