65
<Insert Picture Here> Sergey Kuksenko Java Platform Performance Java Memory Model

Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

<Insert Picture Here>

Sergey KuksenkoJava Platform Performance

Java Memory Model

Page 2: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

2

<Insert Picture Here>

Agenda

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

Page 3: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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.”

Page 4: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

4

<Insert Picture Here>

Agenda

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

Page 5: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

5

Memory wall

• 1980– скорость одной операции CPU ~ скорость одного доступа к памяти

• 2010– скорость CPU выросла более чем в 10000 раз

– скорость памяти выросла в ~10 раз

Page 6: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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

Page 7: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

7

в итоге

• Сложная архитектура современных CPU– многоядерность– OoO (Out of Order execution)– Store buffers (+ store forwarding)

– Сложная иерархия кешей– Протоколы когерентности кешей (MESI, MOESI, MESIF, …)

– NUMA, ccNUMA

• “Умные” компиляторы

Page 8: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

8

Пример 1

Thread 1 Thread 2

Начальные значения: A == B == 0

r1 = B;A = 1;

r2 = A;B = 1;

Page 9: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

9

Пример 1

Thread 1 Thread 2

Начальные значения: A == B == 0

r1 = B;A = 1;

r2 = A;B = 1;

Какие значения могут быть для r1 и r2?

Page 10: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

10

Пример 1

Thread 1 Thread 2

Начальные значения: A == B == 0

r1 = B;A = 1;

r2 = A;B = 1;

Какие значения могут быть для r1 и r2?

<r1, r2>1) < 0, 0 > ? 2) < 0, 1 > ?3) < 1, 0 > ?4) < 1, 1 > ?

Page 11: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

11

Пример 1

Thread 1 Thread 2

Начальные значения: A == B == 0

r1 = B;A = 1;

r2 = A;B = 1;

Какие значения могут быть для r1 и r2?

<r1, r2>1) < 0, 0 > + 2) < 0, 1 > +3) < 1, 0 > +4) < 1, 1 > +Reordering

Page 12: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

12

Пример 2

Thread 1 Thread 2

Начальные значения: A == B == 0

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

Thread 3

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

Page 13: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

13

Пример 2

Thread 1 Thread 2

Начальные значения: A == B == 0

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

Thread 3

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

Результат: r1 == 1

или (xor) r1 == 0

?

Page 14: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

14

Пример 2

Thread 1 Thread 2

Начальные значения: A == B == 0

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

Thread 3

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

Результат: r1 == 1 или (or) r1 == 0

!

Thread 2 видит write A первым потокомThread 3 видит write B вторым потоком ПЕРЕД тем как увидит write A

VisibilityВозможно:

Page 15: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

15

Кто виноват?

program order

execution order

visibility order

Page 16: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

16

Кто виноват?

program order

Компилятор

execution order

visibility order

Page 17: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

17

Кто виноват?

program order

Компилятор

execution order

visibility order

HW memory model

OoO (Out of Order)

Page 18: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

18

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

A=1; ...

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

Page 19: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

19

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

A=1; ...

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

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

Page 20: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

20

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

A=1; ...

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

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

Page 21: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

21

Нарушения атомарности:

– Целевая платформа не содержит операции 32битной записи (e.g. только 16 бит) => раздельная запись старшей и младшей частей.

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

Атомарность

• Atomicity

int A = 0xABCDFFFF;

Page 22: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

22

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

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

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

• Ordering (порядок)

Page 23: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

23

<Insert Picture Here>

Agenda

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

Page 24: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

24

Старая JMM

...;

...;

Thread 1

...;

...;

Thread 2thread

local

memory

thread

local

memory

MainMemory

Page 25: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

25

Старая JMM

...;

...;

Thread 1

...;

...;

Thread 2thread

local

memory

thread

local

memory

MainMemory

Page 26: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

26

JMM

• Переменные:– static field, instance field, array element

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

Page 27: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

27

volatile arrays?

• volatile A[] array;• volatile – не транзитивно:

– ...=array; - volatile read– array=...; - volatile write– array[i]=...; - обычный write

• А если очень нужно?– java.util.concurrent.atomic

(AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray)

Page 28: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

28

Атомарность

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

• No out of thin-air values:– Всякое чтение переменной возвратит либо значение по

умолчанию либо значение записанное (где-либо) в эту переменную.

Page 29: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

29

Атомарность

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

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

Page 30: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

30

Атомарность

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

являются атомарными!– v++, v-- – неатомарные операции!

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

Page 31: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

31

Visibility

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

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

Page 32: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

32

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

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

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

Page 33: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

33

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

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

Visibility (happens-before)

Page 34: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

34

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

...

unlock(M1)

...

...

lock(M1)

...

Thread 1

Thread 2

На одном и том же

мониторе!

Page 35: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

35

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

...

write(V)

...

...

read(V)

...

Thread 1

Thread 2 V - volatile

На одной и той же

переменной!

Page 36: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

36

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

• thread.start() → первое действие в потоке

• Последнее действие в потоке → join(), isAlive()

• Запись default value в любую переменную → первое действие в потоке

Page 37: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

37

Reordering

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

данным.

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

Page 38: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

38

Reordering

lock

read/write

read/write

unlock

read/write

Roach motel

Page 39: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

39

Reordering

read/write

volatile write

read/write

read/write

volatile read

read/write

Page 40: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

40

Пример 3

Thread 1 Thread 2

Начальные значения: int A = 0;boolean ready = false;

A = 41;A = 42;ready = true;A = 43;

while(!ready);System.out.println(A);

Что будет напечатано?

- ничего- 0- 41- 42- 43

Page 41: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

41

Пример 3

Thread 1 Thread 2

Начальные значения: int A = 0;boolean ready = false;

A = 41;A = 42;ready = true;A = 43;

while(!ready);System.out.println(A);

Что будет напечатано?

- ничего +- 0 +- 41 +- 42 +- 43 +

Page 42: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

42

Пример 4

Thread 1 Thread 2

Начальные значения: int A = 0;volatile boolean ready = false;

A = 41;A = 42;ready = true;A = 43;

while(!ready);System.out.println(A);

Что будет напечатано?

- ничего- 0- 41- 42- 43

Page 43: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

43

Пример 4

Thread 1 Thread 2

Начальные значения: int A = 0;volatile boolean ready = false;

A = 41;A = 42;ready = true;A = 43;

while(!ready);System.out.println(A);

Что будет напечатано?

- ничего- 0- 41- 42 +- 43 +

Page 44: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

44

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

class A {final B ref;public A(...){

this.ref=...;}…

}

• После завершения конструктора любой тред видит значения записаные в final поле – а также все дерево объектов начиная

с этого поля (dereference-chain).

freeze

Page 45: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

45

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

class A {final B ref;public A(...){

this.ref=...;}…

}

• Требуется - this не должен убегать (escape) из конструктора.– e.g. регистрация listener в его-же

конструкторе.

• Модификации в final dereference-chain выполненные после завершения конструктора подчиняются обычным правилам видимости.

freeze

Page 46: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

46

<Insert Picture Here>

Agenda

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

Page 47: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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; } ...}

Page 48: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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; } ...}

Page 49: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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; }}

Page 50: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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; }}

Page 51: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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; }}

Page 52: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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; }}

Page 53: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

53

<Insert Picture Here>

Agenda

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

Page 54: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

54

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

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

– Влияние на оптимизации компилятора

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

Page 55: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

55

Тест 1

for(...) { //128 timesv = arr[i]++;

}

Тест не измеряет ничего реального1 operation :

– 129 операций чтения (всегда non-shared, thread local)– 128 операций записи (всегда non-shared, thread local)– немного арифметики– 128 oпераций записи (4 варианта теста):

– shared / non shared

– volatile / non volatile

Page 56: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

56

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

Page 57: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

57

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

Page 58: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

58

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

Page 59: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

59

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

Page 60: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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;

}

Page 61: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

61

Тест 2 (rev. 1)

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;

}

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

Throughput = 495 ops/msec

Page 62: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

62

Тест 2 (rev. 2)

private volatile int[] array = new int[10000];...public void test(){

int s = 0;for(int i=0; i<array.length; i++) {

s+=array[i];}sum = s;

}

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

Throughput = 62 ops/msec

Page 63: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

63

Тест 2 (rev. 3)

private volatile int[] array = new int[10000];...public void test(){

int s = 0;int[] a = array;for(int i=0; i<a.length; i++) {

s+=a[i];}sum = s;

}

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

Throughput = 495 ops/msec

Page 64: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

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

Page 65: Java Memory Model · 64 Читаем • "Java Concurrency in Practice", Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea

65

Q&A ?