SlideShare a Scribd company logo
~Java   ~
        @hakurai
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
stopRequested




    Java        HotSpot
while(!stopRequested){   if(!stopRequested){
  i++;                       while(true){
}                              i++;
                             }
                         }
while(!stopRequested){   if(!stopRequested){
  i++;                       while(true){
}                              i++;
                             }
                         }
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
Java

synchronized



volatile
synchronized

               synchronized



synchronized
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
private final Object lock = new Object();
private List<String> list;

public void add(String text){
  synchronized (lock){
      listadd(text);
  }
}
private final Object lock = new Object();
private List<String> list;

public void add(String text){
  synchronized (lock){
      listadd(text);
  }
}
private final Object lock = new Object();
private List<String> list;

public void add(String text){
  synchronized (lock){
      listadd(text);            lock
  }
}
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
private final Object lock = new Object();
private List<String> list;

public String get(int index){
  synchronized (lock){
      return list.get(index);
  }
}
private final Object lock = new Object();
private List<String> list;

public String get(int index){
  synchronized (lock){
      return list.get(index);          list
  }
}
private final Object lock = new Object();
private List<String> list;

public void add(String text){
  synchronized (lock){
      list.add(text);
  }
}

public String get(int index){
      return list.get(index);
}
private final Object lock = new Object();
   private List<String> list;

   public void add(String text){
     synchronized (lock){
         list.add(text);
               list
     }
   }
IllegalArgumentException

   public String get(int index){
         return list.get(index);
   }
private final Object lock = new Object();
   private List<String> list;

   public void add(String text){
     synchronized (lock){
         list.add(text);
               list
     }
   }
IllegalArgumentException

   public String get(int index){
         return list.get(index);
   }
//   Java
1
                  2
                  3
Java




   null   (   )
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
!

1       2   N
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
1   2   N
T
(atomic)
from   to
from   to
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
1
1
1
2
2
2
3
3
3
4
4
4
1
2
2
2
3


V               T       A


    P

            V       T
        B
                Q
3




P   Q
3



(1)P       Q
       P
(2)Q
(3)Q
(4)P
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
1
2
L       T   L
V       T
    V
private final Object lock = new Object();
private List<String> list;

private String get(int index){
   synchronized (lock){
      return list.get(index);
   }
}
private final Object lock = new Object();
private List<String> list;

private String get(int index){
   synchronized (lock){
      return list.get(index);         list
   }
}
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
volatile

   volatile
volatile                   1

   V           T   V
       T



   V           T       V
           T
volatile                   2

   V           T       V
           T



   V           T   V
       T
volatile

           volatile
volatile                                                 3

 volatile                                 (reordering)



  private int num = 0;
  private volatile boolean initialized;

  public void run(){
    num = 100;
    initialized = true;
  }
volatile                                                 3

 volatile                                 (reordering)



  private int num = 0;
  private volatile boolean initialized;

  public void run(){
    num = 100;                  num
    initialized = true;
  }
volatile



           Java
T
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
Java

Java

Effective Java

More Related Content

What's hot (20)

PPT
Logstash
琛琳 饶
 
PDF
Logstash: Get to know your logs
SmartLogic
 
PDF
Logstash-Elasticsearch-Kibana
dknx01
 
ODP
Using Logstash, elasticsearch & kibana
Alejandro E Brito Monedero
 
PPTX
MessagePack - An efficient binary serialization format
Larry Nung
 
PDF
Logstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
Startit
 
PPTX
Elk stack
Jilles van Gurp
 
PPT
How ElasticSearch lives in my DevOps life
琛琳 饶
 
PDF
Kotlin wonderland
Jedsada Tiwongvokul
 
PDF
devday2012
Juan Lopes
 
PDF
PyCon KR 2019 sprint - RustPython by example
YunWon Jeong
 
PPTX
Scaling an ELK stack at bol.com
Renzo Tomà
 
PDF
Logstash family introduction
Owen Wu
 
PDF
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
Airat Khisamov
 
PDF
The Ring programming language version 1.8 book - Part 15 of 202
Mahmoud Samir Fayed
 
PPTX
The Gradle in Ratpack: Dissected
David Carr
 
ODP
Meetup slides
suraj_atreya
 
PDF
Java Search Engine Framework
Appsterdam Milan
 
PPTX
FreeRTOS Xilinx Vivado: Hello World!
Vincent Claes
 
Logstash
琛琳 饶
 
Logstash: Get to know your logs
SmartLogic
 
Logstash-Elasticsearch-Kibana
dknx01
 
Using Logstash, elasticsearch & kibana
Alejandro E Brito Monedero
 
MessagePack - An efficient binary serialization format
Larry Nung
 
Logstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
Startit
 
Elk stack
Jilles van Gurp
 
How ElasticSearch lives in my DevOps life
琛琳 饶
 
Kotlin wonderland
Jedsada Tiwongvokul
 
devday2012
Juan Lopes
 
PyCon KR 2019 sprint - RustPython by example
YunWon Jeong
 
Scaling an ELK stack at bol.com
Renzo Tomà
 
Logstash family introduction
Owen Wu
 
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
Airat Khisamov
 
The Ring programming language version 1.8 book - Part 15 of 202
Mahmoud Samir Fayed
 
The Gradle in Ratpack: Dissected
David Carr
 
Meetup slides
suraj_atreya
 
Java Search Engine Framework
Appsterdam Milan
 
FreeRTOS Xilinx Vivado: Hello World!
Vincent Claes
 

Similar to 並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~ (20)

KEY
ぐだ生 Java入門第ニ回(synchronized and lock)
Makoto Yamazaki
 
KEY
ぐだ生 Java入門第ニ回(synchronized and lock)
Makoto Yamazaki
 
PPT
Java concurrency begining
maksym220889
 
PDF
Javaoneconcurrencygotchas 090610192215 Phpapp02
Tarun Kumar
 
PPTX
Effective java - concurrency
feng lee
 
PDF
Java Concurrency Gotchas
Alex Miller
 
PDF
Concurrency grab bag: JavaOne 2010
Sangjin Lee
 
PDF
Highly Scalable Java Programming for Multi-Core System
James Gan
 
PDF
Concurrecy techdrop
Michael Barker
 
DOCX
Java 5 concurrency
priyank09
 
PDF
Java Concurrency Gotchas
Alex Miller
 
PDF
Study effective java item 78 synchronize access to mutable data
Isaac Liao
 
PDF
Non-blocking synchronization — what is it and why we (don't?) need it
Alexey Fyodorov
 
PDF
Synchronize access to shared mutable data
Kohei Nozaki
 
PPTX
Николай Папирный Тема: "Java memory model для простых смертных"
Ciklum Minsk
 
KEY
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...
Charles Nutter
 
PDF
Java Concurrency Idioms
Alex Miller
 
PDF
Java Runtime: повседневные обязанности JVM
odnoklassniki.ru
 
PPT
Java concurrency
ducquoc_vn
 
KEY
JavaOne 2012 - JVM JIT for Dummies
Charles Nutter
 
ぐだ生 Java入門第ニ回(synchronized and lock)
Makoto Yamazaki
 
ぐだ生 Java入門第ニ回(synchronized and lock)
Makoto Yamazaki
 
Java concurrency begining
maksym220889
 
Javaoneconcurrencygotchas 090610192215 Phpapp02
Tarun Kumar
 
Effective java - concurrency
feng lee
 
Java Concurrency Gotchas
Alex Miller
 
Concurrency grab bag: JavaOne 2010
Sangjin Lee
 
Highly Scalable Java Programming for Multi-Core System
James Gan
 
Concurrecy techdrop
Michael Barker
 
Java 5 concurrency
priyank09
 
Java Concurrency Gotchas
Alex Miller
 
Study effective java item 78 synchronize access to mutable data
Isaac Liao
 
Non-blocking synchronization — what is it and why we (don't?) need it
Alexey Fyodorov
 
Synchronize access to shared mutable data
Kohei Nozaki
 
Николай Папирный Тема: "Java memory model для простых смертных"
Ciklum Minsk
 
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...
Charles Nutter
 
Java Concurrency Idioms
Alex Miller
 
Java Runtime: повседневные обязанности JVM
odnoklassniki.ru
 
Java concurrency
ducquoc_vn
 
JavaOne 2012 - JVM JIT for Dummies
Charles Nutter
 
Ad

More from Kazuhiro Eguchi (8)

PDF
JavaFX8
Kazuhiro Eguchi
 
PDF
実践Knockout
Kazuhiro Eguchi
 
PDF
なれる!クラスローダー
Kazuhiro Eguchi
 
KEY
Knockout
Kazuhiro Eguchi
 
KEY
Java 並行処理の基礎update1
Kazuhiro Eguchi
 
KEY
Starting java fx
Kazuhiro Eguchi
 
KEY
Automate the Swing application testing
Kazuhiro Eguchi
 
実践Knockout
Kazuhiro Eguchi
 
なれる!クラスローダー
Kazuhiro Eguchi
 
Knockout
Kazuhiro Eguchi
 
Java 並行処理の基礎update1
Kazuhiro Eguchi
 
Starting java fx
Kazuhiro Eguchi
 
Automate the Swing application testing
Kazuhiro Eguchi
 
Ad

Recently uploaded (20)

PPTX
AI in Daily Life: How Artificial Intelligence Helps Us Every Day
vanshrpatil7
 
PDF
Market Insight : ETH Dominance Returns
CIFDAQ
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
PDF
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
PDF
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
PDF
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
PDF
RAT Builders - How to Catch Them All [DeepSec 2024]
malmoeb
 
PPTX
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
PDF
Researching The Best Chat SDK Providers in 2025
Ray Fields
 
PDF
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
PDF
Per Axbom: The spectacular lies of maps
Nexer Digital
 
PDF
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
PPTX
Agile Chennai 18-19 July 2025 | Workshop - Enhancing Agile Collaboration with...
AgileNetwork
 
PPTX
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
PDF
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
PPTX
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PDF
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
AI in Daily Life: How Artificial Intelligence Helps Us Every Day
vanshrpatil7
 
Market Insight : ETH Dominance Returns
CIFDAQ
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
RAT Builders - How to Catch Them All [DeepSec 2024]
malmoeb
 
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
Researching The Best Chat SDK Providers in 2025
Ray Fields
 
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
Per Axbom: The spectacular lies of maps
Nexer Digital
 
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
Agile Chennai 18-19 July 2025 | Workshop - Enhancing Agile Collaboration with...
AgileNetwork
 
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 

並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~

  • 1. ~Java ~ @hakurai
  • 3. stopRequested Java HotSpot
  • 4. while(!stopRequested){ if(!stopRequested){ i++; while(true){ } i++; } }
  • 5. while(!stopRequested){ if(!stopRequested){ i++; while(true){ } i++; } }
  • 9. synchronized synchronized synchronized
  • 11. private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ listadd(text); } }
  • 12. private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ listadd(text); } }
  • 13. private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ listadd(text); lock } }
  • 16. private final Object lock = new Object(); private List<String> list; public String get(int index){ synchronized (lock){ return list.get(index); } }
  • 17. private final Object lock = new Object(); private List<String> list; public String get(int index){ synchronized (lock){ return list.get(index); list } }
  • 18. private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ list.add(text); } } public String get(int index){ return list.get(index); }
  • 19. private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ list.add(text); list } } IllegalArgumentException public String get(int index){ return list.get(index); }
  • 20. private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ list.add(text); list } } IllegalArgumentException public String get(int index){ return list.get(index); }
  • 21. // Java
  • 22. 1 2 3 Java null ( )
  • 24. ! 1 2 N
  • 26. 1 2 N
  • 27. T
  • 29. from to
  • 30. from to
  • 35. 1
  • 36. 1
  • 37. 1
  • 38. 2
  • 39. 2
  • 40. 2
  • 41. 3
  • 42. 3
  • 43. 3
  • 44. 4
  • 45. 4
  • 46. 4
  • 47. 1
  • 48. 2
  • 49. 2
  • 50. 2
  • 51. 3 V T A P V T B Q
  • 52. 3 P Q
  • 53. 3 (1)P Q P (2)Q (3)Q (4)P
  • 55. 1
  • 56. 2 L T L V T V
  • 57. private final Object lock = new Object(); private List<String> list; private String get(int index){ synchronized (lock){ return list.get(index); } }
  • 58. private final Object lock = new Object(); private List<String> list; private String get(int index){ synchronized (lock){ return list.get(index); list } }
  • 61. volatile volatile
  • 62. volatile 1 V T V T V T V T
  • 63. volatile 2 V T V T V T V T
  • 64. volatile volatile
  • 65. volatile 3 volatile (reordering) private int num = 0; private volatile boolean initialized; public void run(){ num = 100; initialized = true; }
  • 66. volatile 3 volatile (reordering) private int num = 0; private volatile boolean initialized; public void run(){ num = 100; num initialized = true; }
  • 67. volatile Java
  • 68. T

Editor's Notes