1

此代码是否存在任何同步/引用问题?

(假设myStrings已经实例化了。)

MySynch.java

public class MySynch
{
    public static String[] myStrings = new String[10];

    public static void updateStrings()
    {
        synchronized (myStrings)
        {
            myStrings = new String[10]; // Safe?

            myStrings[0] = something[0];
            myStrings[1] = somethingElse[4];
        }
    }
}

对象数组myStrings可以被多个线程读取,并且有一个线程通过运行来更新(写入)它updateStrings()。从它读取的线程也将使用一个synchronized (myStrings)块来读取它,当然,为了安全起见。

锁定数组并在锁定它的块再次实例化它synchronized(如上所述)是否存在问题?

4

4 回答 4

4

有一个同步问题:当 myStrings 设置为一个新实例,并且紧接着第二个线程正在执行该方法时,第二个线程将同步 myStrings 的第二个实例。

您应该在类或任何其他静态最终对象上同步

synchronized(MySynch.class) {
    ...
}
于 2011-09-22T15:25:11.133 回答
2

我能看到的唯一问题是有可能在正确实例化数组之前执行读取。

于 2011-09-22T15:13:16.270 回答
2

您将获得 myStrings 的不一致值,最好有两个同步块或方法,一个用于更新,另一个用于获取类锁并将您的 myStrings 私有。

// update
synchronized (YourClass.class) {
    // update
}

// get
synchronized (YourClass.class) {
    // get
}
于 2011-09-22T15:30:24.777 回答
1

清洁工,IMO。

public class MySynch {
private static AtomicReference<String[]> myStrings = new AtomicReference<String[]>(
        new String[0]);

public static void updateStrings() {
    String[] tmp = new String[2];
            ....
    myStrings.set(tmp);

}

public static String[] getStrings() {
    return myStrings.get();
}

}
于 2011-09-22T15:39:40.063 回答