SlideShare uma empresa Scribd logo
1 de 65
Baixar para ler offline
<Insert Picture Here>      Java Memory Model




Sergey Kuksenko
Java Platform Performance
Agenda


•   Для чего?       <Insert Picture Here>



•   Из-за чего?
•   Как
•   Примеры
•   Сколько стоит




                                       2
"Requirements for Programming Language Memory Models"
Jeremy Manson and William Pugh

“If programmers don’t know what their code is
 doing, programmers won’t be able to know what
 their code is doing wrong.”




                                                        3
Agenda


•   Для чего?       <Insert Picture Here>



•   Из-за чего?
•   Как
•   Примеры
•   Сколько стоит




                                       4
Memory wall
• 1980
  – скорость одной операции CPU ~ скорость одного доступа к памяти
• 2010
  – скорость CPU выросла более чем в 10000 раз
  – скорость памяти выросла в ~10 раз




                                                                     5
The Free Lunch Is Over
• 1980
  – скорость одной операции CPU ~ скорость одного доступа к памяти
• 2010
  – скорость CPU выросла более чем в 10000 раз
  – скорость памяти выросла в ~10 раз


• 2005 “The Free Lunch Is Over”
              http://www.gotw.ca/publications/concurrency-ddj.htm
  – увеличиваем количество CPU



                                                                     6
в итоге

• Сложная архитектура современных CPU
  – многоядерность
  – OoO (Out of Order execution)
  – Store buffers (+ store forwarding)
  – Сложная иерархия кешей
  – Протоколы когерентности кешей (MESI, MOESI, MESIF, …)
  – NUMA, ccNUMA
• “Умные” компиляторы



                                                            7
Пример 1
 Начальные значения: A == B == 0

  Thread 1    Thread 2

   r1 = B;     r2 = A;
   A = 1;      B = 1;




                                   8
Пример 1
 Начальные значения: A == B == 0

  Thread 1    Thread 2             Какие значения могут быть
                                           для r1 и r2?
   r1 = B;     r2 = A;
   A = 1;      B = 1;




                                                               9
Пример 1
 Начальные значения: A == B == 0

  Thread 1    Thread 2             Какие значения могут быть
                                           для r1 и r2?
   r1 = B;     r2 = A;
   A = 1;      B = 1;
                                               <r1, r2>
                                          1)   < 0, 0 >   ?
                                          2)   < 0, 1 >   ?
                                          3)   < 1, 0 >   ?
                                          4)   < 1, 1 >   ?



                                                               10
Пример 1
 Начальные значения: A == B == 0

  Thread 1    Thread 2             Какие значения могут быть
                                           для r1 и r2?
   r1 = B;     r2 = A;
   A = 1;      B = 1;
                                               <r1, r2>
                                          1)   < 0, 0 >   +
                                          2)   < 0, 1 >   +
                                          3)   < 1, 0 >   +
                 Reordering               4)   < 1, 1 >   +



                                                               11
Пример 2
 Начальные значения: A == B == 0

  Thread 1       Thread 2           Thread 3

   A = 1;      while( A != 1 ) ;   while( B != 1 ) ;
               B = 1;              r1 = A;




                                                       12
Пример 2
 Начальные значения: A == B == 0

  Thread 1       Thread 2           Thread 3
                                                       Результат:
   A = 1;      while( A != 1 ) ;   while( B != 1 ) ;
                                                         r1 == 1
               B = 1;              r1 = A;
                                                        или (xor) ?
                                                         r1 == 0




                                                                      13
Пример 2
    Начальные значения: A == B == 0

     Thread 1       Thread 2           Thread 3
                                                          Результат:
      A = 1;      while( A != 1 ) ;   while( B != 1 ) ;
                                                            r1 == 1
                  B = 1;              r1 = A;
                                                           или (or) !
                                                            r1 == 0
                               Visibility
Возможно:
   Thread 2 видит write A первым потоком
   Thread 3 видит write B вторым потоком ПЕРЕД тем как увидит write A


                                                                        14
Кто виноват?




 program       execution   visibility
   order         order       order




                                        15
Кто виноват?
               Компилятор




 program         execution   visibility
   order           order       order




                                          16
Кто виноват?
                     Компилятор




 program                execution              visibility
   order                  order                  order




               OoO                     HW
           (Out of Order)           memory model


                                                            17
Def: “операция завершилась”


 A=1;                 Как определить,
               что “операция завершилась”?
 ...




                                             18
Def: “операция завершилась”


 A=1;                   Как определить,
                 что “операция завершилась”?
 ...


      А) Началось исполнение следующей операции.
      Б) Значение оказалось в основной памяти.
      Ц) Результат записи виден в точке использования.




                                                         19
Def: “операция завершилась”


 A=1;                   Как определить,
                 что “операция завершилась”?
 ...


      А) Началось исполнение следующей операции.
      Б) Значение оказалось в основной памяти.
      Ц) Результат записи виден в точке использования.




                                                         20
Атомарность

• Atomicity
                                Нарушения атомарности:
int A = 0xABCDFFFF;
                      – Целевая платформа не содержит операции
                       32битной записи (e.g. только 16 бит) => раздельная
                       запись старшей и младшей частей.

                      – x86: адрес A не выровнен относительно размера.




                                                                         21
Основные свойства модели памяти


• Atomicity (атомарность)

• Visibility (видимость)

• Ordering (порядок)




                                  22
Agenda


•   Для чего?       <Insert Picture Here>



•   Из-за чего?
•   Как!
•   Примеры
•   Сколько стоит




                                      23
Старая JMM


Thread 1     thread            thread   Thread 2
              local             local
             memory            memory
   ...;                                    ...;
   ...;                                    ...;




                       Main
                      Memory




                                                   24
Старая JMM


Thread 1     thread            thread   Thread 2
              local             local
             memory            memory
   ...;                                    ...;
   ...;                                    ...;




                       Main
                      Memory




                                                   25
JMM


• Переменные:
  – static field, instance field, array element
• Операции:
  – чтение/запись обычных переменных (read/write)
  – чтение/запись volatile переменных (volatile read/write)
  – синхронизация (lock/unlock)




                                                              26
volatile arrays?


• volatile A[] array;
• volatile – не транзитивно:
  – ...=array;         - volatile read
  – array=...;         - volatile write
  – array[i]=...;      - обычный write
• А если очень нужно?
  – java.util.concurrent.atomic
    (AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray)



                                                                  27
Атомарность


• Операции чтения/записи являются атомарными.

• No out of thin-air values:
  – Всякое чтение переменной возвратит либо значение по
    умолчанию либо значение записанное (где-либо) в эту
    переменную.




                                                          28
Атомарность


• Исключение:
  – Допускается неатомарное чтение/запись для типов
    long/double.

  – Чтение/запись volatile long/double обязано быть
    атомарным.




                                                      29
Атомарность


• Часто встречаемая ошибка:
  – Для volatile long/double только операции чтения/записи
    являются атомарными!
  – v++, v-- – неатомарные операции!


• Что делать?
  – synchronized
  – java.util.concurrent.atomic



                                                             30
Visibility


• Отношение happens-before:

  – Если X happens-before Y, то X выполнится раньше и Y
    будет видеть результат X.




                                                          31
Visibility (happens-before в пределах потока)


• В пределах одного потока:

  – Все операции имеют отношение happens-before в
    соответствии с program order
   (как написано в тексте программы)




                                                    32
Visibility (happens-before)


• happens-before транзитивно:

  – Если X happens-before Y и Y happens-before Z,
    то X happens-before Z.




                                                    33
Visibility (happens-before между потоками)
Thread 1
                                         Thread 2

               ...
                                   ...
                                                    На одном
           unlock(M1)                               и том же
                                lock(M1)            мониторе!
               ...
                                   ...




                                                                34
Visibility (happens-before между потоками)
Thread 1
                                        Thread 2
                                                   V - volatile
              ...
                                  ...
                                                    На одной
           write(V)                                  и той же
                                read(V)            переменной!
              ...
                                  ...




                                                                  35
Visibility (happens-before между потоками)


• thread.start() → первое действие в потоке
• Последнее действие в потоке → join(), isAlive()
• Запись default value в любую переменную → первое
  действие в потоке




                                                     36
Reordering

• Допустимые перестановки внутри одного треда:
  – Обычные read/write с точностью до зависимости по
    данным.


• Volatile read/write и lock/unlock не могут
  переупорядочиваться.




                                                       37
Reordering

             read/write
                          Roach motel

               lock


             read/write


              unlock


             read/write


                                        38
Reordering


      read/write       read/write




     volatile write   volatile read



      read/write       read/write




                                      39
Пример 3
 Начальные значения:
 int A = 0;
 boolean ready = false;                Что будет напечатано?
   Thread 1    Thread 2
                                        - ничего
A = 41;       while(!ready);            - 0
A = 42;       System.out.println(A);    - 41
ready = true;
                                        - 42
A = 43;
                                        - 43




                                                               40
Пример 3
 Начальные значения:
 int A = 0;
 boolean ready = false;                Что будет напечатано?
   Thread 1    Thread 2
                                        - ничего   +
A = 41;       while(!ready);            - 0        +
A = 42;       System.out.println(A);    - 41       +
ready = true;
                                        - 42       +
A = 43;
                                        - 43       +




                                                               41
Пример 4
 Начальные значения:
 int A = 0;
 volatile boolean ready = false;       Что будет напечатано?
   Thread 1    Thread 2
                                        - ничего
A = 41;       while(!ready);            - 0
A = 42;       System.out.println(A);    - 41
ready = true;
                                        - 42
A = 43;
                                        - 43




                                                               42
Пример 4
 Начальные значения:
 int A = 0;
 volatile boolean ready = false;       Что будет напечатано?
   Thread 1    Thread 2
                                        - ничего
A = 41;       while(!ready);            - 0
A = 42;       System.out.println(A);    - 41
ready = true;
                                        - 42     +
A = 43;
                                        - 43     +




                                                               43
Специальная семантика final полей


 class A {               • После завершения конструктора
    final B ref;           любой тред видит значения
    public A(...){         записаные в final поле
      this.ref=...;        – а также все дерево объектов начиная
    }                        с этого поля (dereference-chain).
    …
 }           fre
                   ez
                     e



                                                                   44
Специальная семантика final полей


 class A {               • Требуется - this не должен убегать
    final B ref;           (escape) из конструктора.
    public A(...){         – e.g. регистрация listener в его-же
      this.ref=...;          конструкторе.
    }                    • Модификации в final dereference-chain
    …                      выполненные после завершения
 }           fre           конструктора подчиняются обычным
                   ez      правилам видимости.
                     e



                                                                   45
Agenda


•   Для чего?       <Insert Picture Here>



•   Из-за чего?
•   Как
•   Примеры
•   Сколько стоит




                                      46
Double-checked locking
class Foo {
    private Helper helper = null;
    public Helper getHelper() {
          if (helper == null)
              synchronized(this) {
                  if (helper == null)
                      helper = new Helper();
              }
          return helper;
    }
    ...
}

                                               47
Double-checked locking
class Foo {
    private volatile Helper helper = null;
    public Helper getHelper() {
          if (helper == null)
              synchronized(this) {
                  if (helper == null)
                      helper = new Helper();
              }
          return helper;
    }
    ...
}

                                               48
Double-checked locking (is it correct?)
class Foo {
    private static volatile List<A> list = null;
    public static List<A> getList() {
        if (list == null)
              synchronized(Foo.class) {
                  if (list == null)
                       list = new ArrayList<A>();
                       list.add(...); list.add(...);
                  }
              }
        return list;
    }
}
                                                       49
Yet another fail

class Foo {
    private A something;
    public synchronized void setSomething(B b) {
        A a = evaluate_A_from_B();
        this.something = a;
    }
    public A getSomething() {
        return this.something;
    }
}


                                                   50
Yet another fail (fix 1)

class Foo {
    private A something;
    public synchronized void setSomething(B b) {
        A a = evaluate_A_from_B();
        this.something = a;
    }
    public synchronized A getSomething() {
        return this.something;
    }
}


                                                   51
Yet another fail (fix 2)

class Foo {
    private volatile A something;
    public synchronized void setSomething(B b) {
        A a = evaluate_A_from_B();
        this.something = a;
    }
    public A getSomething() {
        return this.something;
    }
}


                                                   52
Agenda


•   Для чего?       <Insert Picture Here>



•   Из-за чего?
•   Как
•   Примеры
•   Сколько стоит




                                      53
Производительность


• Как измерить скорость volatile read/write?
  – Влияние HW memory model
  – Влияние на оптимизации компилятора


• x86:
  – volatile read == обычный read
  – volatile write?




                                               54
Тест 1
Тест не измеряет ничего реального
   1 operation :
for(...) { //128 times
   v = arr[i]++;
}
                 – 129 операций чтения (всегда non-shared, thread local)
                 – 128 операций записи (всегда non-shared, thread local)
                 – немного арифметики
                 – 128 oпераций записи (4 варианта теста):
                     – shared / non shared
                     – volatile / non volatile




                                                                           55
i5 (2 core, +HT) = 4 HW threads




                                  56
Intel Westmere-EX (E7-4860) 2.27Ghz, 4x10x2 = 80 HW threads, RHEL 5.5




                                                                        57
Intel Westmere-EX (E7-4860) 2.27Ghz, 4x10x2 = 80 HW threads, RHEL 5.5




                                                                        58
Intel Westmere-EX (E7-4860) 2.27Ghz, 4x10x2 = 80 HW threads, RHEL 5.5




                                                                        59
Тест 2

private int[] array = new int[10000];
...
public void test(){
    int s = 0;
    for(int i=0; i<array.length; i++) {
       s+=array[i];
    }
    sum = s;
}




                                          60
Тест 2 (rev. 1)
                                          i5 (2 core, +HT) = 4 HW threads
private int[] array = new int[10000];
...
public void test(){
    int s = 0;                            Throughput = 495 ops/msec
    for(int i=0; i<array.length; i++) {
       s+=array[i];
    }
    sum = s;
}




                                                                            61
Тест 2 (rev. 2)
                                                 i5 (2 core, +HT) = 4 HW threads
private volatile int[] array = new int[10000];
...
public void test(){
    int s = 0;                                   Throughput = 62 ops/msec
    for(int i=0; i<array.length; i++) {
       s+=array[i];
    }
    sum = s;
}




                                                                                   62
Тест 2 (rev. 3)
                                                 i5 (2 core, +HT) = 4 HW threads
private volatile int[] array = new int[10000];
...
public void test(){
    int s = 0;                                   Throughput = 495 ops/msec
    int[] a = array;
    for(int i=0; i<a.length; i++) {
       s+=a[i];
    }
    sum = s;
}




                                                                                   63
Читаем

• "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch,
  Joseph Bowbeer, David Holmes, Doug Lea
• "The Art of Multiprocessor Programming", Maurice Herlihy, Nir Shavit
• “A Little Book of Semaphores”, Allen B. Downey
  – http://greenteapress.com/semaphores/
• “JSR 133 Cookbook”
  – http://g.oswego.edu/dl/jmm/cookbook.html
• "What Every Programmer Should Know About Memory", Ulrich Drepper
   – http://www.akkadia.org/drepper/cpumemory.pdf



                                                                            64
Q&A ?


        65

Mais conteúdo relacionado

Mais procurados

ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклыdasha2012
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияEvgeny Smirnov
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
Haskell
HaskellHaskell
HaskellDevDay
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
дистанционка
дистанционкадистанционка
дистанционкаtajnan
 
Презентация на тему: Методические особенности подготовки учащихся к выполнени...
Презентация на тему: Методические особенности подготовки учащихся к выполнени...Презентация на тему: Методические особенности подготовки учащихся к выполнени...
Презентация на тему: Методические особенности подготовки учащихся к выполнени...2berkas
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
 
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Alexey Paznikov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Факторизационные модели в рекомендательных системах
Факторизационные модели в рекомендательных системахФакторизационные модели в рекомендательных системах
Факторизационные модели в рекомендательных системахromovpa
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 

Mais procurados (20)

моап 2011 05
моап 2011 05моап 2011 05
моап 2011 05
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсия
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
Haskell
HaskellHaskell
Haskell
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
дистанционка
дистанционкадистанционка
дистанционка
 
Презентация на тему: Методические особенности подготовки учащихся к выполнени...
Презентация на тему: Методические особенности подготовки учащихся к выполнени...Презентация на тему: Методические особенности подготовки учащихся к выполнени...
Презентация на тему: Методические особенности подготовки учащихся к выполнени...
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
 
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Факторизационные модели в рекомендательных системах
Факторизационные модели в рекомендательных системахФакторизационные модели в рекомендательных системах
Факторизационные модели в рекомендательных системах
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 

Destaque

презентация савилова
презентация савиловапрезентация савилова
презентация савиловаdavidovanat
 
доклад электромагнитное излучение
доклад электромагнитное излучениедоклад электромагнитное излучение
доклад электромагнитное излучениеdavidovanat
 
Лекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организмаЛекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организмаdrtanton
 
Reverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machinesReverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machinesSmartDec
 
Бинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVMБинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVMSmartDec
 
влияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сотовлияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сотоAndrei V, Zhuravlev
 
электромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человекаэлектромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человекаAndrei V, Zhuravlev
 
презентация
презентацияпрезентация
презентацияAndrey Fomenko
 
Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека amtc7
 
Негативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защитыНегативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защитыHakimova_AR
 
Системноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образованииСистемноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образованииAnatoly Levenchuk
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureDmitry Buzdin
 
влияние компьютера на человека
влияние компьютера на человекавлияние компьютера на человека
влияние компьютера на человекаZavirukhina
 
низкоуровневое программирование сегодня новые стандарты с++, программирован...
низкоуровневое программирование сегодня   новые стандарты с++, программирован...низкоуровневое программирование сегодня   новые стандарты с++, программирован...
низкоуровневое программирование сегодня новые стандарты с++, программирован...COMAQA.BY
 
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0COMAQA.BY
 
В топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стекеВ топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стекеCOMAQA.BY
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Автоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающихАвтоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающихCOMAQA.BY
 
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...COMAQA.BY
 

Destaque (20)

презентация савилова
презентация савиловапрезентация савилова
презентация савилова
 
доклад электромагнитное излучение
доклад электромагнитное излучениедоклад электромагнитное излучение
доклад электромагнитное излучение
 
Лекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организмаЛекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организма
 
Reverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machinesReverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machines
 
Бинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVMБинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVM
 
влияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сотовлияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сото
 
C++ idioms
C++ idiomsC++ idioms
C++ idioms
 
электромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человекаэлектромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человека
 
презентация
презентацияпрезентация
презентация
 
Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека
 
Негативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защитыНегативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защиты
 
Системноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образованииСистемноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образовании
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop Infrastructure
 
влияние компьютера на человека
влияние компьютера на человекавлияние компьютера на человека
влияние компьютера на человека
 
низкоуровневое программирование сегодня новые стандарты с++, программирован...
низкоуровневое программирование сегодня   новые стандарты с++, программирован...низкоуровневое программирование сегодня   новые стандарты с++, программирован...
низкоуровневое программирование сегодня новые стандарты с++, программирован...
 
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
 
В топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стекеВ топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стеке
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Автоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающихАвтоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающих
 
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
 

Semelhante a Java Memory Model

C language lect_07_introduction
C language lect_07_introductionC language lect_07_introduction
C language lect_07_introductionRoman Brovko
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмdasha2012
 
введение
введениевведение
введениеAndEdr
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Ontico
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Лекция 4 Обработка бинарных изображений
Лекция 4 Обработка бинарных изображенийЛекция 4 Обработка бинарных изображений
Лекция 4 Обработка бинарных изображенийVictor Kulikov
 
«JMM в Android», Максим Ефимов, Redmadrobot
«JMM в Android», Максим Ефимов, Redmadrobot«JMM в Android», Максим Ефимов, Redmadrobot
«JMM в Android», Максим Ефимов, RedmadrobotMail.ru Group
 
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...2berkas
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPythonAnton Patrushev
 

Semelhante a Java Memory Model (17)

C language lect_07_introduction
C language lect_07_introductionC language lect_07_introduction
C language lect_07_introduction
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритм
 
Algo 01 part01
Algo 01 part01Algo 01 part01
Algo 01 part01
 
введение
введениевведение
введение
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Лекция 4 Обработка бинарных изображений
Лекция 4 Обработка бинарных изображенийЛекция 4 Обработка бинарных изображений
Лекция 4 Обработка бинарных изображений
 
«JMM в Android», Максим Ефимов, Redmadrobot
«JMM в Android», Максим Ефимов, Redmadrobot«JMM в Android», Максим Ефимов, Redmadrobot
«JMM в Android», Максим Ефимов, Redmadrobot
 
Лекция 2
Лекция 2Лекция 2
Лекция 2
 
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
 
Pril
PrilPril
Pril
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
106170
106170106170
106170
 
106170
106170106170
106170
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
 

Mais de Dmitry Buzdin

How Payment Cards Really Work?
How Payment Cards Really Work?How Payment Cards Really Work?
How Payment Cards Really Work?Dmitry Buzdin
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Dmitry Buzdin
 
How to grow your own Microservice?
How to grow your own Microservice?How to grow your own Microservice?
How to grow your own Microservice?Dmitry Buzdin
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?Dmitry Buzdin
 
Delivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDelivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDmitry Buzdin
 
Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIsDmitry Buzdin
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахDmitry Buzdin
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fmDmitry Buzdin
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIDmitry Buzdin
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsDmitry Buzdin
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional ProgrammingDmitry Buzdin
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contestDmitry Buzdin
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery Dmitry Buzdin
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOpsDmitry Buzdin
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump AnalysisDmitry Buzdin
 
Pragmatic Java Test Automation
Pragmatic Java Test AutomationPragmatic Java Test Automation
Pragmatic Java Test AutomationDmitry Buzdin
 

Mais de Dmitry Buzdin (20)

How Payment Cards Really Work?
How Payment Cards Really Work?How Payment Cards Really Work?
How Payment Cards Really Work?
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?
 
How to grow your own Microservice?
How to grow your own Microservice?How to grow your own Microservice?
How to grow your own Microservice?
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?
 
Delivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDelivery Pipeline for Windows Machines
Delivery Pipeline for Windows Machines
 
JOOQ and Flyway
JOOQ and FlywayJOOQ and Flyway
JOOQ and Flyway
 
Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIs
 
Whats New in Java 8
Whats New in Java 8Whats New in Java 8
Whats New in Java 8
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на Одноклассниках
 
Dart Workshop
Dart WorkshopDart Workshop
Dart Workshop
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fm
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part II
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional Programming
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contest
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOps
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump Analysis
 
Pragmatic Java Test Automation
Pragmatic Java Test AutomationPragmatic Java Test Automation
Pragmatic Java Test Automation
 

Java Memory Model

  • 1. <Insert Picture Here> Java Memory Model Sergey Kuksenko Java Platform Performance
  • 2. Agenda • Для чего? <Insert Picture Here> • Из-за чего? • Как • Примеры • Сколько стоит 2
  • 3. "Requirements for Programming Language Memory Models" Jeremy Manson and William Pugh “If programmers don’t know what their code is doing, programmers won’t be able to know what their code is doing wrong.” 3
  • 4. Agenda • Для чего? <Insert Picture Here> • Из-за чего? • Как • Примеры • Сколько стоит 4
  • 5. Memory wall • 1980 – скорость одной операции CPU ~ скорость одного доступа к памяти • 2010 – скорость CPU выросла более чем в 10000 раз – скорость памяти выросла в ~10 раз 5
  • 6. The Free Lunch Is Over • 1980 – скорость одной операции CPU ~ скорость одного доступа к памяти • 2010 – скорость CPU выросла более чем в 10000 раз – скорость памяти выросла в ~10 раз • 2005 “The Free Lunch Is Over” http://www.gotw.ca/publications/concurrency-ddj.htm – увеличиваем количество CPU 6
  • 7. в итоге • Сложная архитектура современных CPU – многоядерность – OoO (Out of Order execution) – Store buffers (+ store forwarding) – Сложная иерархия кешей – Протоколы когерентности кешей (MESI, MOESI, MESIF, …) – NUMA, ccNUMA • “Умные” компиляторы 7
  • 8. Пример 1 Начальные значения: A == B == 0 Thread 1 Thread 2 r1 = B; r2 = A; A = 1; B = 1; 8
  • 9. Пример 1 Начальные значения: A == B == 0 Thread 1 Thread 2 Какие значения могут быть для r1 и r2? r1 = B; r2 = A; A = 1; B = 1; 9
  • 10. Пример 1 Начальные значения: A == B == 0 Thread 1 Thread 2 Какие значения могут быть для r1 и r2? r1 = B; r2 = A; A = 1; B = 1; <r1, r2> 1) < 0, 0 > ? 2) < 0, 1 > ? 3) < 1, 0 > ? 4) < 1, 1 > ? 10
  • 11. Пример 1 Начальные значения: A == B == 0 Thread 1 Thread 2 Какие значения могут быть для r1 и r2? r1 = B; r2 = A; A = 1; B = 1; <r1, r2> 1) < 0, 0 > + 2) < 0, 1 > + 3) < 1, 0 > + Reordering 4) < 1, 1 > + 11
  • 12. Пример 2 Начальные значения: A == B == 0 Thread 1 Thread 2 Thread 3 A = 1; while( A != 1 ) ; while( B != 1 ) ; B = 1; r1 = A; 12
  • 13. Пример 2 Начальные значения: A == B == 0 Thread 1 Thread 2 Thread 3 Результат: A = 1; while( A != 1 ) ; while( B != 1 ) ; r1 == 1 B = 1; r1 = A; или (xor) ? r1 == 0 13
  • 14. Пример 2 Начальные значения: A == B == 0 Thread 1 Thread 2 Thread 3 Результат: A = 1; while( A != 1 ) ; while( B != 1 ) ; r1 == 1 B = 1; r1 = A; или (or) ! r1 == 0 Visibility Возможно: Thread 2 видит write A первым потоком Thread 3 видит write B вторым потоком ПЕРЕД тем как увидит write A 14
  • 15. Кто виноват? program execution visibility order order order 15
  • 16. Кто виноват? Компилятор program execution visibility order order order 16
  • 17. Кто виноват? Компилятор program execution visibility order order order OoO HW (Out of Order) memory model 17
  • 18. Def: “операция завершилась” A=1; Как определить, что “операция завершилась”? ... 18
  • 19. Def: “операция завершилась” A=1; Как определить, что “операция завершилась”? ... А) Началось исполнение следующей операции. Б) Значение оказалось в основной памяти. Ц) Результат записи виден в точке использования. 19
  • 20. Def: “операция завершилась” A=1; Как определить, что “операция завершилась”? ... А) Началось исполнение следующей операции. Б) Значение оказалось в основной памяти. Ц) Результат записи виден в точке использования. 20
  • 21. Атомарность • Atomicity Нарушения атомарности: int A = 0xABCDFFFF; – Целевая платформа не содержит операции 32битной записи (e.g. только 16 бит) => раздельная запись старшей и младшей частей. – x86: адрес A не выровнен относительно размера. 21
  • 22. Основные свойства модели памяти • Atomicity (атомарность) • Visibility (видимость) • Ordering (порядок) 22
  • 23. Agenda • Для чего? <Insert Picture Here> • Из-за чего? • Как! • Примеры • Сколько стоит 23
  • 24. Старая JMM Thread 1 thread thread Thread 2 local local memory memory ...; ...; ...; ...; Main Memory 24
  • 25. Старая JMM Thread 1 thread thread Thread 2 local local memory memory ...; ...; ...; ...; Main Memory 25
  • 26. JMM • Переменные: – static field, instance field, array element • Операции: – чтение/запись обычных переменных (read/write) – чтение/запись volatile переменных (volatile read/write) – синхронизация (lock/unlock) 26
  • 27. volatile arrays? • volatile A[] array; • volatile – не транзитивно: – ...=array; - volatile read – array=...; - volatile write – array[i]=...; - обычный write • А если очень нужно? – java.util.concurrent.atomic (AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray) 27
  • 28. Атомарность • Операции чтения/записи являются атомарными. • No out of thin-air values: – Всякое чтение переменной возвратит либо значение по умолчанию либо значение записанное (где-либо) в эту переменную. 28
  • 29. Атомарность • Исключение: – Допускается неатомарное чтение/запись для типов long/double. – Чтение/запись volatile long/double обязано быть атомарным. 29
  • 30. Атомарность • Часто встречаемая ошибка: – Для volatile long/double только операции чтения/записи являются атомарными! – v++, v-- – неатомарные операции! • Что делать? – synchronized – java.util.concurrent.atomic 30
  • 31. Visibility • Отношение happens-before: – Если X happens-before Y, то X выполнится раньше и Y будет видеть результат X. 31
  • 32. Visibility (happens-before в пределах потока) • В пределах одного потока: – Все операции имеют отношение happens-before в соответствии с program order (как написано в тексте программы) 32
  • 33. Visibility (happens-before) • happens-before транзитивно: – Если X happens-before Y и Y happens-before Z, то X happens-before Z. 33
  • 34. Visibility (happens-before между потоками) Thread 1 Thread 2 ... ... На одном unlock(M1) и том же lock(M1) мониторе! ... ... 34
  • 35. Visibility (happens-before между потоками) Thread 1 Thread 2 V - volatile ... ... На одной write(V) и той же read(V) переменной! ... ... 35
  • 36. Visibility (happens-before между потоками) • thread.start() → первое действие в потоке • Последнее действие в потоке → join(), isAlive() • Запись default value в любую переменную → первое действие в потоке 36
  • 37. Reordering • Допустимые перестановки внутри одного треда: – Обычные read/write с точностью до зависимости по данным. • Volatile read/write и lock/unlock не могут переупорядочиваться. 37
  • 38. Reordering read/write Roach motel lock read/write unlock read/write 38
  • 39. Reordering read/write read/write volatile write volatile read read/write read/write 39
  • 40. Пример 3 Начальные значения: int A = 0; boolean ready = false; Что будет напечатано? Thread 1 Thread 2 - ничего A = 41; while(!ready); - 0 A = 42; System.out.println(A); - 41 ready = true; - 42 A = 43; - 43 40
  • 41. Пример 3 Начальные значения: int A = 0; boolean ready = false; Что будет напечатано? Thread 1 Thread 2 - ничего + A = 41; while(!ready); - 0 + A = 42; System.out.println(A); - 41 + ready = true; - 42 + A = 43; - 43 + 41
  • 42. Пример 4 Начальные значения: int A = 0; volatile boolean ready = false; Что будет напечатано? Thread 1 Thread 2 - ничего A = 41; while(!ready); - 0 A = 42; System.out.println(A); - 41 ready = true; - 42 A = 43; - 43 42
  • 43. Пример 4 Начальные значения: int A = 0; volatile boolean ready = false; Что будет напечатано? Thread 1 Thread 2 - ничего A = 41; while(!ready); - 0 A = 42; System.out.println(A); - 41 ready = true; - 42 + A = 43; - 43 + 43
  • 44. Специальная семантика final полей class A { • После завершения конструктора final B ref; любой тред видит значения public A(...){ записаные в final поле this.ref=...; – а также все дерево объектов начиная } с этого поля (dereference-chain). … } fre ez e 44
  • 45. Специальная семантика final полей class A { • Требуется - this не должен убегать final B ref; (escape) из конструктора. public A(...){ – e.g. регистрация listener в его-же this.ref=...; конструкторе. } • Модификации в final dereference-chain … выполненные после завершения } fre конструктора подчиняются обычным ez правилам видимости. e 45
  • 46. Agenda • Для чего? <Insert Picture Here> • Из-за чего? • Как • Примеры • Сколько стоит 46
  • 47. Double-checked locking class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) synchronized(this) { if (helper == null) helper = new Helper(); } return helper; } ... } 47
  • 48. Double-checked locking class Foo { private volatile Helper helper = null; public Helper getHelper() { if (helper == null) synchronized(this) { if (helper == null) helper = new Helper(); } return helper; } ... } 48
  • 49. Double-checked locking (is it correct?) class Foo { private static volatile List<A> list = null; public static List<A> getList() { if (list == null) synchronized(Foo.class) { if (list == null) list = new ArrayList<A>(); list.add(...); list.add(...); } } return list; } } 49
  • 50. Yet another fail class Foo { private A something; public synchronized void setSomething(B b) { A a = evaluate_A_from_B(); this.something = a; } public A getSomething() { return this.something; } } 50
  • 51. Yet another fail (fix 1) class Foo { private A something; public synchronized void setSomething(B b) { A a = evaluate_A_from_B(); this.something = a; } public synchronized A getSomething() { return this.something; } } 51
  • 52. Yet another fail (fix 2) class Foo { private volatile A something; public synchronized void setSomething(B b) { A a = evaluate_A_from_B(); this.something = a; } public A getSomething() { return this.something; } } 52
  • 53. Agenda • Для чего? <Insert Picture Here> • Из-за чего? • Как • Примеры • Сколько стоит 53
  • 54. Производительность • Как измерить скорость volatile read/write? – Влияние HW memory model – Влияние на оптимизации компилятора • x86: – volatile read == обычный read – volatile write? 54
  • 55. Тест 1 Тест не измеряет ничего реального 1 operation : for(...) { //128 times v = arr[i]++; } – 129 операций чтения (всегда non-shared, thread local) – 128 операций записи (всегда non-shared, thread local) – немного арифметики – 128 oпераций записи (4 варианта теста): – shared / non shared – volatile / non volatile 55
  • 56. i5 (2 core, +HT) = 4 HW threads 56
  • 57. Intel Westmere-EX (E7-4860) 2.27Ghz, 4x10x2 = 80 HW threads, RHEL 5.5 57
  • 58. Intel Westmere-EX (E7-4860) 2.27Ghz, 4x10x2 = 80 HW threads, RHEL 5.5 58
  • 59. Intel Westmere-EX (E7-4860) 2.27Ghz, 4x10x2 = 80 HW threads, RHEL 5.5 59
  • 60. Тест 2 private int[] array = new int[10000]; ... public void test(){ int s = 0; for(int i=0; i<array.length; i++) { s+=array[i]; } sum = s; } 60
  • 61. Тест 2 (rev. 1) i5 (2 core, +HT) = 4 HW threads private int[] array = new int[10000]; ... public void test(){ int s = 0; Throughput = 495 ops/msec for(int i=0; i<array.length; i++) { s+=array[i]; } sum = s; } 61
  • 62. Тест 2 (rev. 2) i5 (2 core, +HT) = 4 HW threads private volatile int[] array = new int[10000]; ... public void test(){ int s = 0; Throughput = 62 ops/msec for(int i=0; i<array.length; i++) { s+=array[i]; } sum = s; } 62
  • 63. Тест 2 (rev. 3) i5 (2 core, +HT) = 4 HW threads private volatile int[] array = new int[10000]; ... public void test(){ int s = 0; Throughput = 495 ops/msec int[] a = array; for(int i=0; i<a.length; i++) { s+=a[i]; } sum = s; } 63
  • 64. Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea • "The Art of Multiprocessor Programming", Maurice Herlihy, Nir Shavit • “A Little Book of Semaphores”, Allen B. Downey – http://greenteapress.com/semaphores/ • “JSR 133 Cookbook” – http://g.oswego.edu/dl/jmm/cookbook.html • "What Every Programmer Should Know About Memory", Ulrich Drepper – http://www.akkadia.org/drepper/cpumemory.pdf 64
  • 65. Q&A ? 65