java - 我的代码线程安全吗?

标签 java multithreading

在我的 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 中的同步,所以我对我的代码不太自信。有人能注意到什么不对吗?

最佳答案

如果 MySingleton.getInstance() 始终返回相同的对象,应该没问题。

如果方法调用在不同的时间点返回不同的对象,那么你可能会因为在一个实例上同步,然后在不同的实例上调用等待或通知而出现异常。此外,可能存在内存危险,因为您没有在您正在访问/更新的对象上进行同步。

关于java - 我的代码线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565114/

相关文章:

c++ - 使用 Qt 在 C++ 中进行线程串口通信

iphone - 应该如何使用dispatch_debug?

c# - 获取跨线程操作无效

c# - 为什么额外的异步操作使我的代码比操作根本没有发生时更快?

java - 异步任务的线程池?

java - Vaadin ColorPicker IllegalArgumentException

java - 针对不同事件的 Spring Integration 自定义轮询器

java - 在 Hadoop 中映射应用程序

java - 如何为自定义 Jackson Serializer 编写 JUnit 测试?

java - 从 CentOS 7 终端调用 java 程序