我的代码线程安全吗?

时间:2015-06-01 03:11:27

标签: 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中的同步,所以我对我的代码不太自信。任何人都可以注意到任何错误吗?

1 个答案:

答案 0 :(得分:4)

如果\n总是返回相同的对象,那应该没问题。

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