Android Thread Safe / Lock Free / Atomic 小註解

Atomic (原子) 通常是指一個指令不會被打斷, 例如一道組合語言的指令, 在沒有執行完之前, 就是 ISR (interrupt service routine) 也無法干擾其結果. 同樣的概念如果放到 function 上, 就很難說這個 function 從來都沒有打斷過了. 我們頂多說這個 function 的結果是如預期的.

怎麼樣保證如預期呢?在 Android 當中的 atomic.c 採用暴力的方法進行, 例如要做一個 write.

void android_atomic_write(int32_t value, volatile int32_t* addr) 顧名思義想把 value 寫到這個 addr,  而它裡面的內容就是:

{

int32_t oldValue;

do {

oldValue = *addr;

} while (android_atomic_cmpxchg(oldValue, value, addr);

只要 OldValue 沒有 value, 這個 loop 就不善罷干休. 所以一定可以寫成功. 只要成功了, 就準備離開. 大家可以發現, 如果此時別的 thread 也來寫同樣的位置, 那就出事了. 

為了避免後者的狀況發生, 我們最好不允許這個在有效期間之內又被改掉. 解決之道是 lock 此一變數, 直到 unlock 之前, 都不讓別人改寫. 不過 Android 的 atomic 是 lock-free 的, 所以不需要用 lock. 相對地, 它讓其他的 thread 不會影響到當前的 thread, 也就是確保 thread safe.

怎麼做到 lock free, thread safe 呢, 簡單地說就是避免使用全域變數 (global variable), 只用區域變數 (local variable 或 auto variable). 此時每個 thread 都只針對自己的記憶體空間操作, 就不會影響到別人了.

此外, 我們可以指定哪些變數必須是 automic 的, 例如宣告成:AtomicBoolean, AutomicInteger, AutomicLong, AutomicIntegerFieldUpdate<T> …等等就有保護作用. 這些描述在 java.util.concurrent,automic.

當然, Android 還是有 lock, class 是 java.util.concurrent.locks.

[ref]

1. Android SDK

2. Lock-free atomic operations in Android

3. Thread-Safe的理解與分析

我讀 «怪笑小說»

這本書同樣是東野圭吾先生的短篇小說集. 雖然這些故事說得很好, 但是我覺得最棒的是它的後記. 作者把它如何發想每一個故事的背景都介紹給我們, 讓我們也能一窺作家的創作過程.

“鬱積電車" 的故事是說: 在滿滿都是人的車廂裡, 坐著的抱怨站著的老人孕婦似乎強烈暗示自己要讓坐, 站的抱怨坐的裝睡假裝沒看到他, 小的偷瞄對面女的, 也抱怨人大太多遮了他的視線. 一群陌生人的心裡各懷鬼胎, 認為自己最有道理, 其它人都混帳. 但是表面上風平浪靜, 彷彿在打一場沉默的戰爭. 破冰的契機是某個能讓大家說實話的實驗氣體洩漏了, 一場好戲準備上演.

不消說作者自己受過擠車之苦, 於是他揣摩每個人的立場而變成這篇小說. 據說早年在韓國的地鐵也是這樣, 車子擠到需要 push man 把人塞進去, 以致有地獄鐵之稱. 當年我遇到最擠的就是搭公車. 尤其我從台北回中和的方向, 恰好在北一女的下游. 所以經常看到一整車小綠綠把車廂都塞滿了, 公車經常直接不停, 或是假裝停一下, 但半個人也擠不進去. 我只好走一個小時的路回家…

“追星阿婆" 這篇是說原本靠著老人年金勉強度日的阿婆, 因為拿到免費的演唱會門票, 不小心變成帥哥的粉絲. 從此她就過著要追星還是要過日子的掙扎之中. 當然偶像的魅力是超乎想像的, 所以阿婆最後成了濃妝豔抹卻營養不良的犧牲品. 人類常常有所不足, 想要的東西若超出自己的能力範圍, 就變成了一種痛苦.

作者得到這個靈感的契機是家庭因素 – 呃, 不是東野夫人去追星了. 而是作者爸爸的發現. 東野爸爸從事金飾加工業, 他發現有個客人三天兩頭就拿金飾來加工, 一會兒改胸針, 一會兒改戒指或是耳環. 追問之下才知道這是參加影友會的行頭, 歐巴桑為了不想讓偶像看出自己只有一件飾品, 所以流傳著不用花大錢就可以變花樣的這種招數.

“一徹老爸" 的典故來自漫畫巨人之星, 主角的老爸名叫星一徹, 他積極培養兒子星飛雄馬成為職棒選手, 也就是 “巨人之星". 本篇小說中的架構也差不多, 當爸爸的甚至把女兒當男生養, 直到兒子出世才放手. 有了兒子, 女兒變成高爾夫球選手的事, 老爸也都不想聞問, 只顧著兒子如何進入名門高校, 以及被球團選上.

爸爸希望兒子能夠成為左投, 故採取不人道的方式強迫他用左手. 希望他進男校, 以免分心到談戀愛的事情上. 花了一生心力在兒子上的老爸, 最後…兒子勉強得到第六指名 (也就是實況野球中最低的那一種), 和一個讀男校帶來的意外 “副作用".

“逆轉同學會" 這篇的靈感來自作者一向不喜歡老師, 或是說其實老師一向不喜歡東野先生. 因此他假設了一個以老師為主的聚會, 而老師們為了找點新鮮事, 決定邀請他們心目中最優秀的那屆學生來助興. 在老師的眼光中, 學生就是那樣菜菜的, 不論好或壞, 都有值得說笑的地方. 結果學生真的來參加之後, 成就和層次完全把老師比了下去. 學生們談論的法律, 科學或商業話題, 老師們完全插不上嘴. 就在老師們準備敗興而歸的時候, 一位準備當老師的畢業生姍姍來遲, 使得老師們的專長終於有了用武之地.

“超狸理論" 的故事靈感來自於作者討厭偽科學, 於是他安排了一位不知道是否真的看過超級狸貓的人, 舌戰那些自以為了解外星人的專家. 在超級狸貓專家的眼中, UFO 和外星人都可以用狸貓來解釋, 於是偽科學大戰偽科學, 讓人啼笑皆非.

“無人島大相撲轉播" 取材於一位作者家鄉的大叔. 大叔說雖然非常失志, 但是他能背出看過的職棒比賽. 不只是背誦比數等數字而已, 而是像收音機轉播一樣, 可以把球場上每個小動作都依序重現, 大概什麼 “要揮不揮", “轉頭看看二壘跑者, 做了一個假牽制"  之類的東西都沒有漏掉. 於是作者創造了一位可以背誦歷年來所有相撲比賽實況的達人, 並且安排他不遇上不能照本宣科的關頭, 把這個當作小說的高潮.

“獻給某位老爺爺的線香" 說的是第一人稱返老還童的故事. 作者在奶奶以 99 歲高齡過世的守靈夜想出這個故事. 如果人不是變老而是變年輕, 這個題材可以拍成 “班傑明的奇幻旅程". 如果弱智的人接受手術而變成天才, 這個題材被用在 “獻給阿爾吉儂的花束". 後者激發了作者的想像, 因此安排老邁的爺爺逐漸變成一個年輕人, 再迅速退化成老人的心路歷程.  

“尸台社區" 這個故事是講一個命案, 但是看得我快要笑翻了. 作者的靈感來自買不起市區房屋的痛苦. 不得已買到郊區的屋主只能眼睜睜地看市區房價創新高, 而自己的房子卻不停跌價. 此時社區裡竟然發現了一具屍體, 房價肯定又要再跌了. 怎麼辦? 把屍體丟到別的社區去. 另一個社區也有同樣的問題, 竟然如法炮製, 又把屍體丟過來. 一具屍體被來回丟了 N 次, 從偷偷摸摸變成全社區動員大作戰. 最後這具可憐屍骨已經不全了, 久而久之演變成兩個社區間的運動會 – 只要把球放在對方的社區就贏.

“動物家庭" 這篇裡面, 每個人在主角的眼中都變成了不同的動物. 變成動物或是甲蟲這種題材, 應該是老梗了. 本篇最突出的地方大概有兩個: 全篇一開始並沒有說明這些動物的關係, 等到中間的部份我們才理解爸爸是狸貓, 而媽媽是狐狸犬之類的. 另一個特別的地方是, 主角本來並不是甚麼特定的動物, 但是在大家的壓迫之下, 終於明確地變成了最兇暴的噴火怪獸.

LTE 4G 頻段表

這次去韓國, 看到滿街都在賣 4G 手機. 從 2011年 7 月起佈建的 LTE 網路, 據說到 2013 年才能正式完工. 雖然現在沒有那麼完整的覆蓋率, 但是導遊都對他手上的 4G 手機深具信心, 號稱比 3G (3.75G 吧!) 快 5 倍. 我想民族自信心就是這樣來的吧! 雖然咱們導遊是拿台灣護照的, 他對 Samsung 可是讚不絕口.

反觀台灣這個 “科技島", 要到 2015 年才開始建設 4G, 估計要到 2017 年才能把 LTE 或 LTE-A 搞好, 感覺真是不可思議. 一來疑似圖利 WiMax 業者, 二來主要電信業者也過於怠惰. 如果電信業者自命為穩定獲利股, 恐怕真的不想花錢建基地台吧? 

[釜山市 LTE 充斥圖]

SONY DSC

雖然我們已經可以買到 4G 手機了, 但買到的 LTE 手機究竟能不能互通呢? 很抱歉! 看下表就知道基本上很難互通. 目前世界各國主流採用的頻段, 台灣都已經用掉了. 換言之, NCC 若不強制回收現有頻段, LTE 是不可能提早開工的! 更不用說我們的 4G 手機 (非 WiMax) 要買哪個規格都沒辦法預知. 

[世界各國 LTE 頻段表]

下表的 V 代表使用這個頻段,  X 代表這個頻段已經有人用了.

 MHz  700   800  900  1800 1900  2100  2300  2500  2600
 ITU
 北美  V  V
 西歐  V  V
 東歐  V  V  V  V
 亞太  V  V
 中東 / 非洲  V  V
 其他地區或國家  V  V
 預估主流  V  V  V  V
 香港  V  V  V
 日本  V
 韓國  SKT/LG  KT
 中國 (TD-LTE)  V  V
 台灣  X  X  X  X  X  X  X

修復 WordPress 上下標問題

先前就發現了, 即使在編輯器中修改好的上下標字形, 在部落格裡面就硬是爛的. 前陣子寫的幾篇剛好又用到不少上下標, 只好認真去解這個 bug. 

根據 3 年前 moshu 所寫的文章, 這個病因來自於 style sheet.

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}

用來表示上下標的 sub (superscript), 包括 <sub></sub>, 以及表示下標的 sub (subscript), 包括 <sup></sup> 都被 style sheet reset 掉了. 因為單獨寫個測試 html 也是好的, 只不過被 wordpress 的主題給改壞掉.

這個要怎麼改呢?

在 "控制台" 選 "外觀" 的 "佈景主題", 找到 /* reset */, 把那兩個 keyword delete 掉, 再更新檔案就好了.

我讀 «我讀 “毒笑小說»

“毒笑小說" 是一本短篇小說集. 本書原名 “どくしょうしょうせつ", 完全照實翻譯. 至於 “毒" 在什麼地方?  倒是沒有那麼明顯. 例如綁架天國這篇在 “黑笑小說" 裡就出現過. 整體來說, 本書確實有幾篇都帶給讀者 “莫可奈何的人生" 的味道, 也把很普遍存在的微妙想法寫成一個個殊堪玩味的小故事.

Angel 說的人類對環保的概念, 其實講到全世界都在保護 Angel, 但日本人卻義正詞嚴地吃起 Angel 的那一段, 大家應該都會想到 “鯨魚" 吧! 當然故事不是這麼簡單, Angel 從珍貴稀有到後來氾濫成災而被棄養, 最後變成恐怖害 “蟲", 不但寫出了人類對環保的價值搖擺不定, 也暗示了核輻射的危害.

“手工貴婦" 講到眾家夫人為了不想得罪上司的太太, 威屈求全地接收貴婦大方贈送的各種手工藝品,  吃的, 用的都有. 可惜貴婦並無自知之明, 每周聚會還要點名大家發表心得, 偶而也會拜訪老公的下屬, 確認大家使用 “產品" 的狀況, 造成每個家庭身心的折磨. 這位看似一無是處的貴婦,  最後成功地做出一個高難度的手工藝 —- 竊聽器, 她終於聽到了大家真正的心聲. 原來貴婦是讀理工的料, 不愧是 IC 設計公司主管的老婆.

“程序警察" 這篇諷刺官僚系統. 一時衝動殺了自己老婆的兇手想要去自首, 不過政府已經推動制式報案流程, 所以他要從掛號開始, 進入一連串荒謬的司法程序. 包括未按程序自首, 只好再跑一趟. 警方明知道他要自首, 還是調查他認不認識被害人? 勘查現場的時候, 則詢問他有沒有看到形跡可疑的人等等. 所以這位兇手變得每天要跑警局, 卻無法被起訴或是拘留. 最後一段最能夠引起我的共鳴, 我們只是默默承受著身邊的各種程序, 而說不定作者的靈感就是這樣來的.

“我要一個漢堡."

“您需要搭配套餐嗎?"

“不, 我只要漢堡."

“需要搭配薯條或飲料嗎?"

“我只要漢堡."

現在漢堡搭奶昔特價只要 XX 元, 加 Y 元升級特大漢堡需要嗎?"

“…."

“爺爺當家" 是說平日嚴肅的爺爺, 想初嘗禁果 – 偷看孫子的 A 片. 因此忍痛故意不和家人外出吃大餐. 誰知當天來了闖空門的小偷搗亂, 陰錯陽差之下, 不懂得操作電器的爺爺最後沒看成 A 片, 反倒引來警察把小偷抓住. 可惜爺爺的事蹟也敗露了. 老人看 A 片的點子不錯, 作者東野先生也把這個題材寫得很有趣. 爺爺的老花眼, 把 A 片女主角的山寨藝名看成本尊的藝名, 山寨女優又和正版女優激似, 以致爺爺當了真.  A片商的策略也變成小說題材, 真是好樣的.

“新郎人偶" 描述的事件都很單純, 由平鋪直敘中就可以知道作者在講強勢媽媽教出維維諾諾的兒子. “女作家" 只有一個梗, 那就是文壇只重包裝. “殺意使用說明書" 沒有特定的中心思想, 只是以幻想又詼諧的方式描述恨到想殺人的心理. 不過在參考了複雜的說明書之後, 殺意也慢慢消退了.

“補償" 這篇很巧妙地描述了這位工作狂其實只用了左腦, 職業和人生都是左腦選的, 右腦真是很無奈啊! 主角想刻意補償自己的 “右腦", 於是他主動改變自己, 把部分的人生還給右腦. 雖然說本篇的主角是切除胼胝體的患者, 不過很多人不是也都這樣的妥協嗎? 心裡可能想過另外一種生活,只不過一直都沒有補償過自己.

“光榮的證言" 說到平日不起眼的主角因為目擊殺人案件而受到矚目, 他在欣喜之餘, 也完全沉溺在這個案件中. 雖然他自己發覺指認錯了嫌犯, 不過為了他意外的光榮時刻, 他決定繼續堅持錯誤的證言.

“本格推理周邊鑑定秀" 的靈感大概來自 “開運鑑定團", 這個短篇不但有喜感, 更有推理. 窮老爸的遺產只是一個木棍, 但這根木棍卻可以藉由 “鑑定秀" 賣得 1000 萬元. 這筆錢不是 “鑑定秀" 節目上開出的買價, 而是勒索來的, 這個安排真是峰迴路轉.

“綁架電話網"  是非常有想像力的一篇.  綁架犯不跟家屬勒索, 而是隨機打電話找人付錢. “和您沒關係是吧!? 但是您不忍心無辜的小孩因為您的小氣而死吧?" 被勒索的人很無奈, 又被警告不能報警, 最後也想出打隨機電話找替死鬼的招數. 後來替死鬼又找他的替死鬼, 替死鬼再找他的替死鬼….. 直到電視報導有個嫌犯落網了,這個勒索鍊還是持續運作著. 誰知道他的上線是否是真的綁架犯? 電視上的那個? 還是單純找替死鬼的?