簡體   English   中英

Java:線程安全的命名約定?

[英]Java: naming conventions for thread safety?

想象一下我有這堂課:

class Notifier {
    public Listener listener;

    public void notify() {
        if (listener != null) {
            listener.stuffHappens();
        }
    }
}

如果可以從另一個線程更改listener則此代碼不正確。 讓我們修復它:

class Notifier {
    public volatile Listener listener;

    public void notify() {
        Listener l = listener;
        if (l != null) {
            l.stuffHappens();
        }
    }
}

該代碼現在是正確的,但notify()方法看起來很奇怪。 想象一個更大的類,在同一方法中混合使用了volatile和regular字段,您將獲得圖片。

我的第一個沖動是將變量volatileListener命名為-假設它是私有的,當然還有一個setListener() ,但是我想象很多人會以“匈牙利符號表示邪惡”來setListener()

那么,是否有既定的慣例/慣例? 也許有一些模式可以系統地避免這種情況。 在編寫大量的多線程代碼時您會怎么做?

在編寫大量的多線程代碼時您會怎么做?

將不關心線程的代碼與不關心線程的代碼分開。

有一個負責通知的類是一個好的開始,但是您對“從另一個線程更改偵聽器”的評論令人不安-並使您的listener變量公開更令人不安。 將其設為私有,然后向Notifier添加方法以控制更改。

並且不要向Notifier添加除了通知偵聽器以外的任何代碼

這不是命名約定,但是在《 Java Concurrency in Practice》中 ,作者建議使用批注來描述線程安全策略。

我強烈推薦這本書給任何用Java寫多線程代碼的人。

Brian Goetz在他的《 Java Concurrency in Practice》一書中建議使用Annotations將字段標記為類或不保存線程。

http://www.javaconcurrencyinpractice.com/annotations/doc/net/jcip/annotations/package-summary.html

(無神經Anon是正確的,單獨保存線程而不是踩踏保存代碼。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM