發表文章

目前顯示的是 2017的文章

為什麼 GUI framework 大多都是 single-threaded (not thread safe)

        主要原因為有兩個不同方向的 operation:GUI activity 跟 input event。 GUI activity 是由 UI 最上層 app code 一路到底層 OS, 而 input event 則是相反,從底層 OS 一路往上到 app code。         要用 lock 來保護不同方向的 operation 很難,很容易 deadlock, 所以比較省事的方法就是所有 GUI activity 都用一個 thread 處理 (一種 event driven 的概念), 這樣另一個方向的 input event 就能當成是一種「event」。 參考資料:      Multithreaded toolkits: A failed dream?      Why must/should UI frameworks be single threaded?      Why are most UI frameworks single threaded?      Why is a single threaded model used to update the UI as main thread?      What does threadsafe mean?

transient 介紹

        某天無意間看到了 ArrayList 的 source code,發現了一個沒看過的關鍵字:transient。寫 Android 也有幾年了,卻對 transient 完全沒概念。 Google 了一下,才知道這個關鍵字通常都是搭配 Serializable 來使用的。  什麼是 Serializable          Serializable 是為了要讓 物件能序列化 而必需要實作的 marker interface。而序列化簡單說就是能 將記憶體(Memory)中的實體物件(Object Instance)以位元流(byte stream)方式儲存於永久媒體如硬碟 。之後也能從永久媒體讀取物件到記憶體,並回復到先前狀態。除了存在永久媒體之外,也可以用在網路溝通,如 socket 或 RMI。  什麼是 transient           transient 為 Java 內部的一個關鍵字,其目的是告訴 JVM 有加 transient 的 member variable 不要被序列化 。因為有時候我們會希望物件能序列化,但內部有些資料卻不要記錄,像是個人資料如密碼等。如以下的程式碼: public class Foo implements Serializable { private String saveMe; private transient SomeObject dontSaveMe; private transient String password; private transient int dontSaveInt; //... }         JVM 就不會把 class dontSaveMe,String password,int dontSaveInt 序列化。   Java  Serializable 序列化規則   Class 中所有 primitive type 預設都是可以序列化。 成員變數 (prim...

volatile 介紹

        volatile 關鍵字 只能用在 variable ,不能用在 method 或是 class,其目的是告訴 Java compiler 或是 Thread, 讀取 variable 的值都要從 main memory 去讀取 。因此假如你想讓 int , boolean  等 variable 的 讀值或是寫值的行為是 atomic ,就可以使用 volatile。         從 Java 5 之後,宣告為 volatile 的 variable 就具有 " happens-before relationship ",且可以防止 Java compiler 對程式碼做 reorder 來達到最佳化的效果。         用程式碼來解釋 volatile 的用法,比較簡單的範例就是  Singleton Pattern : public class Singleton { // 利用 volatile, 可以保證此變數的值是一致的 private volatile static Singleton sInstance; private Singleton(){} public static Singleton getInstance() { // 只有第一次建立物件才會完整執行此段程式 if(sInstance == null) { synchronized (Singleton.class) { // 進入同步區後再檢查一次, // 還是 null 才建立實體 if(sInstance == null) { sInstance = new Singleton(); } } } return sInsta...