此代码是否存在任何同步/引用问题?
(假设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
块(如上所述)的问题?
答案 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();
}
}