我很清楚,在布爾上同步不是一種好的做法。 有很多的解釋,爲什麼它不是很好,如:它是否允許在新的布爾值(true)上同步
Why is it not a good practice to synchronize on Boolean?
等
所以,很顯然,這是不好的做法:
代碼在盒裝原始常量(如 布爾值)上同步。
private static Boolean inited = Boolean.FALSE;
...
synchronized(inited)
{
if (!inited)
{
init();
inited = Boolean.TRUE;
}
}
...
我感興趣的是,如果我們創建一個「新」的運營商,即成才這樣(這是從真正的代碼,我沒有寫,但我維護它,名字最終靜態布爾發生了什麼方法等發生變化):
private final static Boolean lock = new Boolean(true);
...
public static SomethingGeneric getSomething()
{
synchronized(lock)
{
if (somethingElse == null)
{
try
{
somethingElse = persistence.valueobject.getSomeValue(GET_THAT);
System.out.println("blah blah");
}
catch (ObjectCreationException oce)
{
// report the error
log.error("There was this and that error", oce);
System.out.println("Could not create it");
}
}
return somethingElse;
}
}
難道是那麼「合法」使用它?一樣的,如果我們使用的對象,如:
private final Object lock = new Object();
或
private static final Object lock = new Object();
public void doSomething() {
synchronized (lock) {
// ...
}
}
我不明白爲什麼不。畢竟,new Boolean()instanceof Object == true'。 – Siguza
對鎖定使用'static final'有點沒有意義 - 您可以在類對象上同步以產生相同的鎖定語義('synchronized(SomethingGeneric.class){...}') –
如果您顯式創建一個鎖定對象,你也可以使用「new Object()」,或者如果你想要更好的可讀性,爲此目的創建一個類LockObject(空主體)並使用該類型。 new Boolean()在語義上的工作原理相同,但您的代碼的讀者總是會想知道爲什麼選擇了Boolean。 – Durandal