Monthly Archives: 9月 2010

「Java並行処理プログラミング」第8回(9月30日)

Posted on by 0 comment

参加者 沼田(読み手)、今井(記)
範囲 pp. 68 – 75

第4章 オブジェクトを組み立てる

  • 4-1 スレッドセーフなクラスを設計する
    • 4-1-3 ステートのオーナー
  • 4-2 インスタンス拘束
    • 4-2-1 Javaのモニタパターン
      • p.72 List 4-3
        • widgetはprivateでなくて良いのか。privateでないと他のクラスからmyLockのロックを獲得せずに、このwidgetのステートにアクセスまたは変更できてしまう。たとえmyLockのロックを獲得するというルールを用いても、myLockはprivateなので他クラスからはこのロックを獲得できない。
        • 「Javaの鉄則」によると、myLockのようなロックオブジェクトは、byte[] myLock = new byte[0]; がオブジェクト生成時のコストもオブジェクトのサイズも小さくて良いらしい。
    • 4-2-2 例:業務車両の追跡管理
      • p.73 上のコード
        locations.keySet()をforでまわすより、locations.entrySet()をまわすほうが、for内でMapの検索(locations.get(key))を行わなくてもvalueがとれるので良いのではないか。
        locations.entrySet()後にオブジェクトが削除される可能性を考えると、本のコードの方が楽? 次ページのList 4-4を先読みすると、getLocations()はコピーがかえるのでその心配はなさそう。
      • p.74 †3
        「deepCopyの中でコピーコンストラクタを使ってHashMapに中身を入れるのもだめです。」のコピーコンストラクタは、HashMapのコピーコンストラクタのこと。MutablePointのコピーコンストラクタではない。

「Java並行処理プログラミング」第7回(9月28日)

Posted on by 0 comment

参加者 青木(読み手)、沼田、今井(記)
範囲 pp. 59 – 68

第3章 オブジェクトを共有する

  • 3-5 安全な公開
    • 3-5-1 正しくない公開:良いオブジェクトがだめになるとき
      • p.59 List 3-15のHolderクラスをList 3-14のように使用すると、なぜassertSanity()でAssertionErrorが発生することがあるのかわからない。

        おそらくアウト・オブ・オーダー実行があることを考えなければならないため。正確ではないかもしれないが、以下のような事が起こる可能性があるということだと思う。

        CPUの最適化によって、メモリのロードやストアの順番をかえて実行されることがある。よって、あるスレッドで値を変更してもそれが変更順通りにメモリに反映されるとは限らない。変更しているスレッドからみれば順番がかわることはないが、他のスレッドは値を得るときにメモリから得るので、順番が変わって見えることがある。

        たとえばholder = new Holder(42);はすでにメモリまで反映されているが、this.n = n;の反映はまだメモリにされていない状態では、他のスレッドからはholderは新しいがnは古い値(intデフォルト値の0)が見える。この状態でholder->assertSanity()を呼ぶとif (n != n)の左辺のthis.nは古い値が見える。右辺のtihs.nを見る前にthis.n = n;の反映がメモリまでされれば、コンストラクタで設定された新しい値が見えて n != nが trueになる。

    • 3-5-2 不可変なオブジェクトと初期化の安全性
    • 3-5-3 安全な公開のための定石
    • 3-5-4 実質的に不可変なオブジェクト
    • 3-5-5 可変オブジェクト
    • 3-5-6 オブジェクトを安全に共有する
  • 第4章 オブジェクトを組み立てる
    • 4-1 スレッドセーフなクラスを設計する
    • 4-1-1 同期化要件をまとめる
    • 4-1-2 ステートに依存する操作

「Java並行処理プログラミング」第6回(9月24日)

Posted on by 0 comment

参加者 今井(読み手)、青木、沼田(記)
範囲 pp. 50 – 59

第3章 オブジェクトを共有する

  • 3-3 スレッド拘束
    • 3-3-1 その場かぎりのスレッド拘束
    • 3-3-2 スタック拘束
    • 3-3-3 ThreadLocal
      • ThreadLocaクラスのinitialValueの実装
        Javadocを見ると、「この実装は、単に null を返すだけです。プログラマがスレッドローカル変数が null 以外の初期値を持つようにする場合、ThreadLocal をサブクラス化して、このメソッドをオーバーライドする必要があります。通常、匿名の内部クラスが使用されます。」とありました。
  • 3-4 不可変性
    • 3-4-1 finalフィールド
    • 3-4-2 例:volatileを使って不可変オブジェクトを公開する
  • 3-5 安全な公開

「Java並行処理プログラミング」第5回(9月21日)

Posted on by 0 comment

参加者 沼田(読み手)、今井、青木(記)
範囲 pp. 42 – 49

第3章 オブジェクトを共有する

  • 3-1 可視性
    • 3-1-2 アトミックでない64ビットの操作
    • 3-1-3 ロックの可視性
    • 3-1-4 揮発性変数
      • p.46 揮発性変数を使用する条件の2番目に「不変項」という言葉が出てくる。普段使い慣れない言葉なので「不変項」がよく理解できなかったが、不変条件(invariant)のことです(p.20)。
  • 3-2 公開と逸出
    • 3-2-1 安全なコンストラクション

「Java並行処理プログラミング」第4回(9月17日)

Posted on by 0 comment

参加者 青木(読み手)、沼田、今井(記)
範囲 pp. 32 – 42

第2章 スレッドセーフ

  • 2-4 ステートをロックでガードする
  • 2-5 生存と実行性能
    • p.35 Fig.2-1
      L, U って何だろう。→ lock, unlock の意だろう。
    • p.36 List 2-8
      もと(p.30 List 2-6)は、if, else で書かれていたが、synchronizedをいれたので、if, else で書けなくなり、if (factors == null) で元のelseを表している。

第3章 オブジェクトを共有する

  • 3-1 可視性
    • 3-1-1 陳腐化したデータ

「Java並行処理プログラミング」第3回(9月13日)

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp.19 – 31

第I部 基礎編
第2章 スレッドセーフ

  • 2-1 スレッドセーフって何?
    • 2-1-1 例:ステートレスなサーブレット
  • 2-2 アトミック性
    • 2-2-1 競り合い状態
    • 2-2-2 例:遅延初期化の競り合い状態
    • 2-2-3 複合アクション
  • 2-3 ロック
    • p.27 最後の行 「最前の数」:最後に素数分解した数のことだろう
    • 2-3-1 固有のロック(Java言語自身のロック機能)
    • 2-3-2 再入性

「Java並行処理プログラミング」第2回(9月7日)

Posted on by 0 comment

参加者 沼田(読み手)、青木(記)
範囲 pp.4 – 19

第1章 はじめに

  • 1-2 スレッドの利点
    • 1-2-2 設計の単純化
    • 1-2-3 非同期イベントの処理を単純化
      • p.5 †1 NPTLは「Native POSIX Thread Library」の略
    • 1-2-4 応答性の良いユーザインタフェイス
  • 1-3 スレッドのリスク
    • 1-3-1 安全性の危機
    • 1-3-2 生存の危機
    • 1-3-3 実行性能の危機
  • 1-4 スレッドはいたるところにある

第I部 基礎編
第2章 スレッドセーフ

「Java並行処理プログラミング」第1回(9月3日)

Posted on by 0 comment

参加者 青木(読み手)、沼田、今井(記)
範囲 pp. i – p.4

日本語訳に向けて
まえがき
謝辞
本書の使い方
サンプルコード

  • p.ix 注記2 原書の Mr.YUK, Mr.Could Be Happier は、どんなアイコンなのだろう?
    → スマイルマークみたいなのでした。amazon.com の LOOK INSIDE で見ることができます。

第1章 はじめに

  • 1-1 並行処理の歴史(を駆け足でお勉強)
  • 1-2 スレッドの利点
    • 1-2-1 マルチプロセッサの有効利用