2014年6月11日水曜日

Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems (Week 2)

==== Lecture ====
Section 1 Module 2 Part 4: Java Synchronization and Scheduling Classes
Reentrant lock, Reentrant readwrite lock, semaphore, conditional object, countDown Latch
性能問題についての考察も必要。

Section 1 Module 2 Part 5: Java ReentrantLock
[ReentrantLock - Java]
排他ロック
bracketed: lockする人と解除する人が同じ。
bridge pattern: GoF
fair, non-fair: lockの獲得方法。
fairだと待ち時間が長いthread優先。non-fairは順番の保証なしだが軽い。
recursive lock: 同一threadからの再取得可能。
javaのbuilt-in機能よりは拡張されている(interrupt, non-blocking, timed lock acquisition)
[ArrayBlokingQueue - Android]
Data menberをvolatileにする必要ない。monitor lockの仕組みでcacheの更新を保証。

Section 1 Module 2 Part 6: Java ReentrantReadWriteLock
[ReentrantReadWriteLock - Java]
synchronization mechanism: 同時に複数のthreadが同じ共有資源にアクセス。
あるthreadでwriteしている時は他threadからはread/write出来なくする。
writeよりreadが多いmulti-core環境での性能向上に貢献する。
bridge pattern - GoF: AbstractQueuedSynchronizerの機能を継承。fair/non-fairを共通インタフェースで実装。
[BluetoothSocket - Android]
closable interface
全員が使っていない時にcloseするのにread-write lockが使える。

Section 1 Module 2 Part 7: Java Semaphore
[Semaphore - Java]
有限個数の共有資源へのアクセス。
bracketed: bracketed以外の使い方も出来る。
bridge pattern: cube synchronizer classから継承。fair/non-fairを共通インタフェースで実装。
blockingはsleepを使う。spinより末場合はoverhead大きい。
[VideoEditor - Android]
fair acquisition model
bracketedではない。backgroundでtakeしてuser interfaceでgiveする。
間違いやすいので主にunit testに限定されて他ではあまり見かけない。

Section 1 Module 2 Part 8: Java ConditionObject
[ConditionObject - Java]
synchronization and scheduling mechanism
guarded suspension patternを実装するために使う。
built-in monitor objectは一つしか作れないが、ConditionObjectは沢山作れる。
[Arrayblockingqueue]

Section 1 Module 2 Part 9: Java CountDownLatch
[CountDownLatch - Java]
barrier synchronization
一つのthreadの完了を複数で待ったり、複数のthreadの完了を一つのthreadで待ったり。
bridge-pattan: AbstractQueuedSynchronizerから機能を継承して所有。
カウントは通常はreset出来ない。一回使い切り。
CyclicBarrierでは待ち合わせが完了すると自動的にresetされる。固定数のthreadでお互いに待つ時に使う。
[Contacts Provider - Android]
初期化完了待ちにCountDownLatchを使う。
[bridge-pattan - GoF]
複数の継承関係がある場合に、片方の属性を別の継承ツリーに委譲して所有する。
縦横問題。

Section 1 Module 2 Part 10- Java Synchronization and Scheduling Example (Part 1)
[exapmle: ping pong - Java]
template method, strategy, factory method: reusable,flexible, portable

Section 1 Module 2 Part 11- Java Synchronization and Scheduling Example (Part 2)
[exapmle: ping pong - Java]
strategy pattern: platform strategy print method
template method pattern: the acquire and release
factory method: semaphore based or condition object based
ConditionObject base: more flexible, to print multiple ping or pong strings

Section 1 Module 2 Part 12- Java Built-in Monitor Objects
[Java built-in monitor object]
Java synchronized keyword: synchronized同士の排他実行。変化が他から見える。
synchronizedだけだとqueueが空や一杯の時のblockingが出来ない。
built-in monitor object: JVMに実装されているblokingと通知の仕組み
one wait queueしか持てない
Android's JVMではmonitor objectをPOSIXのmutual lockやcondition variableで実装。
nested monitor lockout problem
notify allの時誰がwake upするかは実装依存。

==== Quiz ====
Quizの内容から大よそLectureの内容が想像できる。
今回はJavaの同期のための仕組みについて。
lock(spin, sleep, reentrant, readwrite), binary/count semaphore, condition-object, synchronize
ping-pong programの話もあり、課題とも関係してそう。
Lectureを全部見終わってからまとめてQuizに挑戦。3回目で52/52獲得。

==== Assignment ====
[Week-2-Assignment-1]
ReentrantReadWriteLockを使う課題。
ReentrantReadWriteLockの説明は下記にある。
http://tutorials.jenkov.com/java-util-concurrent/readwritelock.html
とても短くて簡素な説明のみ。

BuggyLongTest.java
をjava applicationとして実施してfailする事を確認。

とても簡単で20分程度で書けてJUnitもpassしたが、eclipseのwarningが出ている。
CourseのFAQを調べると既に質問されている事項だった。
ただ、これはLectureを注意深く見ても気が付けないと思うが。。。

また、Assignment-Description.txtの記載も微妙で、それもFAQで既に聞いている人がいた。

上記の様な所で悩んで結局予想以上に時間を使ってしまった。

[Peer Evaluation]
Student 1
Warning: The import java.util.concurrent.locks.Lock is never used.
catchしてe.printStackTrace();している。
this.mValue++;等thisを使ってる。でもmRWLockはthisを使っていないなんで?
long value = 0;で初期化している。

Student 2
間違って変更前ファイルを提出している。。。

Student 3
Warning: The import java.util.concurrent.locks.Lock is never used.
try/finallyを使っていない。ただ、evaluationにはどちらでもよいとあり。
defaultではなくてfairで初期化してた。
indentが違うので見づらい。
UnitTestの実行に凄く時間が掛かった。fairにしているからの模様。

Student 4
Warning: The import java.util.concurrent.locks.Lock is never used.
try/finallyを使っていない。ただ、evaluationにはどちらでもよいとあり。
finalをつけている。good。初期化している。thisは使っていない。

Student 5
Warning: The import java.util.concurrent.locks.Lock is never used.
try/finallyを使っていない。ただ、evaluationにはどちらでもよいとあり。
初期化したりしなかったり。thisは使っていない。

[Self Evaluation]
当然満点。ただ、初期化は行った方がよいかも or final? thisは微妙な所。

[Results]
満点で完了!!

[etc.]
5人分のpeer reviewが必要。やらなかった場合は20%のpenalty。
先週はpeer reviewをやらないと自分のevaluationが出来ないとあった気がするが。
今回はthisや初期化やfinal等他の人のコードが参考になって良かった。

==== Etc ====
排他制御、同期制御は普段からよく使うので特に難しくはない。
まだJavaの比率が高くてAndroidの比率は少ない。
排他や同期の概念を説明するためのプログラムと関係ない例が出てきて面白い。
多くのLectureが同じパターンの構成になっている。パターンの講義だから?

==== log ====
2014/05/22 Quiz 00:20
2014/05/22 Lecture 01:00
2014/05/23 Lecture 00:25
2014/05/23 Lecture 02:30
2014/05/24 Quiz 00:15
2014/05/25 Assignments 02:00
2014/06/05 Evaluation 01:15
2014/06/11 Results 00:10

0 件のコメント:

コメントを投稿