[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12613] 2007/2/17 議事録



皆様、おつかれさまでした。昨日の議事録をアップします。
根本

-----------------------------------
Java読書会 2007/2/17 議事録
吉本 大石 小松 小棚木 岩室 村山 遠藤 高橋 鈴木 高橋 根本(記)

P311より
13 明示的なロック
 ポーリングによる入手
 時間制限付き
 インタラプトで入手

ReentrantLockは必ずfinallyで開放をすること、synchronized method より危険

Javaのfinallyつにいて
C++のdestructor はblockを出るときにlocal変数をdestructorが自動で開放する。のでC++は書き忘れはない。
抜けるときに勝手にunlockする。
C#はdisposableがある。C#ではlockはcompilerが勝手にやってくれる。
lock /unlock のネスト交差させる書き方の要求があれば、unlockが自動開放でないことも好意的に解釈できる。
ReentrantLock は lockしたownerが記録されて、自分がオーナであることがわかる。
ReentrantLockは 自分のlockした中身に再度進入できる。
semaphoreにはownerの考えがないので、誰が開放してもよい。

13-1-1 ポーリングによる入手と時間制限付きの入手
 "back off" とは? ←不明な専門用語
  debit() 引き出し
  credit() 入金
accountオブジェクトにtransferメソッドを最初から持たせるべきか?
トランザクションロジックは外出しのほうがいいはず、しかしlockメソッドがpublicなのは不安。 JDK7でのSuper Package = 公開対象パッケージが指定可能、publicの一段下の制限  表記法は宿題 long nanosToLock = unit.toNanos(timeout) の表記方法は、お約束パターン13-1-2 インタラプトできるロックの入手13-1-3 コードブロックにとらわれないロック   連結リストに対して、"hand-over-hand locking" or "lock couping" ロックを次々手繰り寄せる方法。   可変長操作の時に有効。その連結の両端のみをつかんでいればよい。   DCAS (Double compare-and-swap) のCPUがあれば、lock free な操作が可能だかDCASは存在しない。13-2 実行性能への配慮   hotspotが最適化したコードはdumpして見るしか手段がない。 binary hack しかない。      (postgreSQLはvacuumとanalyzeは、必ずかけよう)13-3 公平性(fairness)   公平性を操作するoptionはないのか?   軽量言語の場合はプロセス間通信のほぁ
Δⓘ當\xCC13-4 synchronizedとReentrantLockの使い分け13-5 リードライトロック  Javaの場合はすべてのobjectが組み込みlockを持っているのでトレースしやすい。  java.lang.Objectがwait() notify(), notifyAll()をfinalで持っている  java.util.concurrent では await() signal() signalAll() で衝突を避けている。  JConsoleでアクセスするとdeadlockの検知ができる、しかしReentrantLockの検出は難しい。14 カスタムシンクロナイザを構築する14-1 ステート依存を管理する14-1-1   GrumpyBoundedBuffer  (Grumpy=気難しい)  七人の小人から・・・   ちなみに七人の小人は・・・       Doc       Grumpy       Happy       Sleepy       Bashful       Dopey       Sneezy14-1-2 ポーリングと休眠による荒削りなブロッキング14-1-3 条件キューが助けてくれる  Object.wait() にタイムアウトは設定可能、waitの引数でセットできぁ
襦▷ \xA1timeoutすると、処理が続行するだけ、timeoutの結果は\xBC
茲譴覆ぁ \xA1notfifyAll()は引数なしなので、呼ばれたからといって自分の条件が成立したとはいえない。14-2 条件キューの使い方14-2-2 早すぎるウェイト終了14-2-3 シグナル消失14-2-4 通知 List14-8の実装は、本当に空のときしか通知しないので、使うのはちょっと怖い。 表記上notify()とnotifyAll()ではnotify()がデフォルトに見えるが間違い、notifyAll()をまず使うべき。14-2-5 ゲートクラス14-2-6 サブクラスの安全性の問題14-2-7 条件キューをカプセル化する14-2-8 入り口と出口のプロトコル14-3 明示的な条件オブジェクト  wait()      - await()  notify()    - signal()  notifyAll() - signalAll()  という対比で Conditionインターフェイスを使用する。 Objectクラスの方のメソッドはpublic finalなので  隠せない、@Deprecated なら使えるのではないか?14-5 AbstactQueuedSynchronizer  java.util.concurrent.Lockに AbstactQueuedSynchronizerがある。14-5-1 簡単なラッチ14-6 java.util.co!
ncurrentのシンクロナイザの中のAQS14-6-1 ReentrantLock15 アトミック変数とノンブロッキング同期化   compare-and-swap はアセンブラレベルでのatomic操作15-1 ロックの不利な点   Adaptive lockを実行する、お利口なJVMとは誰か?次回(p359) 15-2 ハードウェアの並行性サポート から