[英]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.