2011-09-22 102 views
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)块来读取它,当然,为了安全起见。

是否存在锁定阵列并再次实例化的问题里面的​​块是否锁定它(如上所述)?

回答

4

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

你应该同步的类或任何其他静态最终目标与

synchronized(MySynch.class) { 
    ... 
} 
+0

谢谢,这听起来不错。还有什么事情需要我去做,比如将课堂声明为最终课程(如果可以的话)或者其他什么? – Doddy

+0

不需要。班上没有任何事情可以将它用作同步监视器。 –

+0

请注意,您可以声明一个类最终。但这意味着它不能被扩展。 –

2

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

+0

哦,假设'myStrings'已经在程序开始的时候被实例化了。 – Doddy

+0

@panic,你有使用“静态”修饰符的原因吗? – mrkhrts

+0

是的,我不会制作这个类的实例,它基本上是一个常用方法库等。 – Doddy

2

您将得到不一致的值myStrings,最好有两个同步块或方法之一更新,另一个用于上一类得到锁定并让您的myStrings保密。

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

// get 
synchronized (YourClass.class) { 
    // get 
} 
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(); 
} 

}