🎯 はじめに
この記事は、40代・Java実務ほぼ未経験の私が、
半年の学習で Java Gold SE17(1Z0‑826-JPN)を93%で合格した方法と、
Gold試験で必ず問われる ライブロック(Livelock) と デッドロック(Deadlock) を実例コードで解説したものです。
Goldは Silverより難易度が高く、特に以下の領域が重要です:
- Stream API ← 頻出・最重要
- ラムダ式
- モジュール
- 並行処理(デッドロック/ライブロック) ← 頻出・最重要
この記事は、これらを体系的に理解したい方にとって再現性の高い学習モデルになります。
1. 前提(バックグラウンド)
👤 プロフィール
- 年齢:40代
- 職種:SE
- 実務ではパートナーさんがコーディングすることが多く、ここ10年ほぼコーディングなし
- 運用・保守で軽微な修正はする
- VB.NETで大規模開発経験あり
- 学生時代に COBOL / C / PHP を学習
- Java Silver SE17(1Z0‑825-JPN)合格済
- Silver合格直後から Gold の学習を開始
📚 学習期間・ペース
- 期間:半年
- 平日:30分〜1時間
- 週末:3時間
📘 使用教材(Amazonリンク)
2. 結果
- 得点:93%(合格基準 65%)で合格
3. 学習方法(再現性の高いモデル)
① 紫本を読む(3周)
Goldは Silverより範囲が広く、
ラムダ式・Stream・モジュール・並行処理などの理解が必須。
② 紫本の練習問題を解く(3周)
- 1周目:理解
- 2周目:定着
- 3周目:弱点潰し
③ 黒本の練習問題を解く(3周)
黒本は本番に近い問題形式で、ひっかけ問題のパターンを把握できます。
④ 模擬試験を全問正解できるまで繰り返す
- 90分で60問(1問90秒)
- 時間感覚を身につける
- 間違えた問題は紫本・API・Copilotで補強
- 正解以外の選択肢がなぜ誤りなのかを必ず確認する
📘 Java SE 17 APIドキュメント
https://docs.oracle.com/javase/jp/17/docs/api/
⑤ 全問正解できたら受験申し込み
受験料が高い(48,593円)ので、100%自信がついてから受験する戦略が合理的。
⑥ 試験日までのリードタイムで弱点補強
よく間違えた問題を中心に復習。
4. Gold SE17の落とし穴(頻出領域)
Goldは Silverより難易度が高く、以下の領域が特に難しい。
🧩 4-1. List.of() の不変リスト問題(頻出)
Goldでは List.of() の不変性 が頻出します。
❌ 例外になる操作(UnsupportedOperationException)
List<String> list = List.of("A", "B", "C");
list.add("D"); // ❌
list.remove("A"); // ❌
list.set(0, "Z"); // ❌
list.sort(String::compareTo); // ❌
✔ 正しい操作方法
List<String> modifiable = new ArrayList<>(List.of("A", "B", "C"));
modifiable.add("D"); // OK
🧩 4-2. モジュール(module-info.java)
module com.example {
requires java.sql;
exports com.example.api;
}
✔ ポイント
- requires / exports の意味
- コマンドラインでのコンパイル・実行方法
- パッケージとモジュールの違い
5. Gold頻出問題の追加解説(重要)
Goldは Silverより 実務寄りのコード読解問題が多い のが特徴です。
以下は本番でほぼ必ず出る領域です。
🔥 5-1. ラムダ式の型推論
Function<String, Integer> f = s -> s.length();
✔ ポイント
- 引数型は推論される
- 戻り値型は 関数型インタフェースの型パラメータ で決まる
🔥 5-2. Stream の中間操作と終端操作
| 種類 | 操作 | 説明 |
|---|---|---|
| 中間操作 | filter / map / sorted | Stream を変換する |
| 終端操作 | collect / findFirst / count | Stream を消費する |
🔥 5-3. Optional の扱い
Optional<String> opt = Optional.of("A");
opt.orElse("B"); // "A"
✔ よくあるひっかけ
-
get()は値がないと例外 -
orElseGet()は遅延評価(Supplier が呼ばれる)
🔥 5-4. 並行処理(ExecutorService)
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(() -> System.out.println("Hello"));
es.shutdown();
✔ ポイント
- shutdown():既存タスクは実行、以降の新規タスクは拒否
- shutdownNow():実行中タスクを割り込み
- Future:非同期結果の取得
- Callable:戻り値あり
- Runnable:戻り値なし
🔥 5-5. モジュールのコマンド(頻出)
javac -d out --module-source-path src $(find src -name "*.java")
java --module-path out -m com.example/com.example.Main
6. 並行処理(ライブロック・デッドロック)
Gold試験では、
ライブロックとデッドロックの違いをコードから読み取る問題が必ず出ます。
7. ライブロック(Livelock)を実例コードで理解する
Gold試験で頻出するライブロックの典型例です。
📘 ライブロックが発生するコード
class Staff {
private String name;
private boolean taskDone;
public Staff(String name, boolean taskDone) {
this.name = name;
this.taskDone = taskDone;
}
public void operate(Staff other) {
while (!other.isTaskDone()) {
System.out.println(other.getName() + " is waiting for " + this.name + " to finish the task...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
}
System.out.println(this.name + " finished the task!");
this.taskDone = true;
}
public String getName() { return this.name; }
public boolean isTaskDone() { return this.taskDone; }
}
public class Livelock {
public static void main(String[] args) {
Staff firstStaff = new Staff("Duke", false);
Staff secondStaff = new Staff("Anna", false);
new Thread(() -> firstStaff.operate(secondStaff)).start();
new Thread(() -> secondStaff.operate(firstStaff)).start();
}
}
🧩 7-1. 何が起きているのか?
- Duke → Anna が終わるまで待つ
- Anna → Duke が終わるまで待つ
両者が 相手の終了を待ち続ける ため、処理が進まない。
ログ例
Anna is waiting for Duke...
Duke is waiting for Anna...
...
🎯 これがライブロック(Livelock)
| 項目 | 内容 |
|---|---|
| スレッド状態 | 動き続ける(進まない) |
| CPU使用率 | 高い |
| 原因 | 譲り合い・待ち合い |
8. デッドロック(Deadlock)を実例コードで理解する
Gold試験で必ず問われるもう一つの罠が デッドロック です。
📘 デッドロックが発生するコード
class ResourceOperator implements Runnable {
private String resource1;
private String resource2;
public ResourceOperator(String resource1, String resource2) {
this.resource1 = resource1;
this.resource2 = resource2;
}
@Override
public void run() {
synchronized(resource1) {
System.out.println(Thread.currentThread().getName() + " locked resource1 (" + resource1 + ")");
synchronized(resource2) {
System.out.println(Thread.currentThread().getName() + " locked resource2 (" + resource2 + ")");
}
}
}
}
public class Deadlock {
public static void main(String[] args) {
String resourceA = "resource-A";
String resourceB = "resource-B";
new Thread(new ResourceOperator(resourceA, resourceB), "First-thread").start();
new Thread(new ResourceOperator(resourceB, resourceA), "Second-thread").start();
}
}
🧩 8-1. 何が起きているのか?
First-thread
- resourceA をロック
- resourceB をロックしようとする
Second-thread
- resourceB をロック
- resourceA をロックしようとする
🔥 結果:互いに相手のロックを待ち続けて停止 → デッドロック
ログ例
First-thread locked resource1 (resource-A)
Second-thread locked resource1 (resource-B)
その後、両スレッドは停止したまま進まない。
🎯 これがデッドロック(Deadlock)
| 項目 | 内容 |
|---|---|
| スレッド状態 | 完全停止 |
| CPU使用率 | 低い |
| 原因 | 循環待ち(Circular Wait) |
9. ライブロックとデッドロックの違い(Gold頻出)
| 項目 | ライブロック | デッドロック |
|---|---|---|
| スレッド状態 | 動き続けるが進まない | 完全停止 |
| CPU使用率 | 高い | 低い |
| 原因 | 譲り合い・待ち合い | 循環待ち |
| Gold試験頻度 | 高い | 高い |
Goldでは コードを読んでどちらか判定する問題が必ず出ます。
10. Stream API(Java Gold SE17 最頻出領域)
Java Gold SE17 では Stream API の仕様レベルの理解が強く問われます。
Silverでは「使えるか」が中心でしたが、Goldでは 「挙動を正しく理解しているか」 が問われます。
以下は本番でほぼ必ず出る頻出ポイントです。
🔥 10-1. Stream は一度しか使えない(使い捨て)
Stream<String> s = Stream.of("A", "B", "C");
s.forEach(System.out::println); // 終端操作
s.count(); // ❌ IllegalStateException(消費済み)
🔥 10-2. 中間操作と終端操作の区別(戻り値で判定)
✔ 中間操作(戻り値が Stream)
- filter
- map
- flatMap
- distinct
- sorted
- limit / skip
- peek
- mapToInt / mapToLong / mapToDouble
✔ 終端操作(Stream 以外を返す)
- forEach
- count
- findFirst
- anyMatch
- collect
- reduce
🔥 10-3. Stream と IntStream の違い(Goldの罠)
Stream
- reduce → Optional
- sum は存在しない
IntStream
- sum / average / max / min が使える
- boxed() で Stream に変換可能
🔥 10-4. 遅延評価(Lazy Evaluation)
Stream.of("A", "B", "C")
.filter(s -> {
System.out.println("filter:" + s);
return true;
}); // 終端操作なし → 何も起きない
🔥 10-5. 短絡評価(short-circuit)
Stream.of("A", "B", "C")
.anyMatch(s -> s.equals("A")); // A で判定終了
🔥 10-6. Optional の扱い
Optional<String> opt = Optional.of("A");
opt.orElse("B"); // "A"
🔥 10-7. Collectors.groupingBy(最頻出)
Map<String, List<Person>> map =
people.stream()
.collect(Collectors.groupingBy(Person::getCity));
🔥 10-8. flatMap(ネスト解除)
Stream<List<String>> nested = Stream.of(List.of("A"), List.of("B"));
nested.flatMap(Collection::stream); // A, B
🔥 10-9. 並列ストリーム(parallelStream)
list.parallelStream().forEach(System.out::println); // 順序不定
🔥 10-10. 終端操作は 1 回だけ(再利用不可)
Stream<String> s = Stream.of("A", "B");
s.forEach(System.out::println);
s.count(); // ❌ IllegalStateException
✍️ Stream APIまとめ(Gold試験の本質)
Java Gold SE17 の Stream API は、
「使える」だけでは不十分で、仕様レベルの挙動を理解しているかが問われます。
特に:
- 終端操作後の再利用不可
- Optional の扱い
- groupingBy の複合構造
- IntStream と Stream の違い
- 並列ストリームの順序保証
11. Oracle公式セミナー(おすすめ)
Oracleが Gold SE17 試験対策セミナー を開催していることがあります。
私は コアAPI編(Stream API以外) を聴講しました。
タイミングが合えばぜひ参加をおすすめします。
12. その他ポイント
- 紫本・黒本と似たコードが結構出る
- デッドロック/ライブロックは必ず出る
- Flow APIのソースも出る
- Stream API・並行処理の比重が高い
- モジュールはコマンドを覚えると楽
13. まとめ:40代・Java経験少なめでも Gold は合格できる
- 紫本 → 黒本 → 模試 の3段階学習が非常に効果的
- Stream・ラムダ・並行処理・モジュールを重点的に対策
- ライブロック/デッドロックの理解は Gold 合格の最重要ポイント
- Silverの延長ではなく「別物」として学ぶと理解が早い
- GoldはSilver以上にコードの動きを理解することが重要
- わからない問題はとにかく動かしてみるのが最短ルート
✍️ 最後に
Java Gold SE17は、
体系的に学べば40代・Java経験少なめでも十分合格できる資格です。
この記事が、これから受験する方の参考になれば嬉しいです。
📚 参考リンク
- Java SE 17 API
https://docs.oracle.com/javase/jp/17/docs/api/ - Gold SE17 紫本
https://www.amazon.co.jp/dp/4798177326 - Gold SE17 黒本
https://www.amazon.co.jp/dp/429502371X