code

2017年1月19日 星期四

Java Concurrency 5 - Publish objects

Publish & Escape

我們把某個internal state / object 提供介面讓外面的程式存取的話,就稱為publish。

如果此object在我們不允許的時候被publish了,稱為escape!


最爛的publish

就是static object
@@~~~ 其實蠻多時候迫不得已要用啊?!

爛的原因在於:
(1)由於是static,thread-safety是個issue

(2)object本身雖然刻意被publish,但是不想被publish的相關物件可能也被publish了。例如此object所包含的data有可能通過public interface被存取,這同樣也有了thread safety的issue。

其次爛的publish: publish internal mutable variables

應該是要給setter,而不是直接給object reference,這樣很危險:



小心constructor ESCAPE

通常是在constructor,我們會init某些data member,給予某個anonymous listener當作參數丟入,不過這邊就是一個escape ! 因為首先 這個inner class instance是有一個hidden的"this" reference到外面的這個object instance,所以洩露了!


另一個危險是,故意去用這個escape instance的人也會陷入危險,因為ThisEscape object還沒有完成construction就洩露了object reference,很多state不一定會符合spec規定。

另外,別從constructor啟動另一個timer或是thread! 理由同上。建議把啟動thread的動作放到constructor之外,就不會有上述的問題。




沒有留言:

張貼留言