同步到要实例化的对象

时间:2011-09-22 15:09:14

标签: java multithreading concurrency locking synchronized-block

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

(假设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 个答案:

答案 0 :(得分:4)

存在同步问题:当myStrings设置为新实例,而第二个线程正在执行该方法之后,第二个线程将同步myStrings的第二个实例。

您应该使用

在类或任何其他静态最终对象上进行同步
synchronized(MySynch.class) {
    ...
}

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

Cleaner,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();
}

}