Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Concurrency Vs multithreading / 25 сообщений из 130, страница 1 из 6
14.04.2014, 11:37
    #38614043
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Понятно, что Concurrency Vs multithreading это где-то рядом, но может всё таки есть какие-то отличия.
...
Рейтинг: 0 / 0
14.04.2014, 12:25
    #38614083
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Если в двух словах, multithreading - это выполнение задачи в нескольких потоках в целом, это скорее как парадигма. Concurrency не может существовать без multithreading - и в нем рассматриваются вопросы по взаимодействию потоков в том числе гарантии видимости, целостности, корректности. Concurrency - это когда есть работа в нескольких потоках с одними и теми же данными.
...
Рейтинг: 0 / 0
14.04.2014, 12:25
    #38614085
For All
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Как по мне оба этих термина про одно и тоже
...
Рейтинг: 0 / 0
14.04.2014, 13:31
    #38614156
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
забыл ник,

то есть когда я пишу thread.start() я думаю в основном о multithreading, а когда о wait/notify, то о concurrency ?
...
Рейтинг: 0 / 0
14.04.2014, 13:50
    #38614178
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
redwhite90забыл ник,

то есть когда я пишу thread.start() я думаю в основном о multithreading, а когда о wait/notify, то о concurrency ?

не совсем, multithreading он же возможен и на одном ядре. Это способ разбить задачу на юниты, которые могут, но не обязаны выполняться параллельно.
Concurrency же рассматривает как раз вопросы параллельного выполнения, и возникающие в связи с этим сложности, видимость, целостность, и тд
...
Рейтинг: 0 / 0
14.04.2014, 14:35
    #38614237
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
забыл ник,

redwhite90то есть когда я пишу thread.start() я думаю в основном о multithreading

забыл никmultithreading он же возможен и на одном ядре. Это способ разбить задачу на юниты, которые могут, но не обязаны выполняться параллельно.

а где противоречие?
...
Рейтинг: 0 / 0
14.04.2014, 15:28
    #38614329
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Мыши против сыра. Рок против наркотиков.
...
Рейтинг: 0 / 0
14.04.2014, 20:03
    #38614717
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
забыл никне совсем, multithreading он же возможен и на одном ядре. Это способ разбить задачу на юниты, которые могут, но не обязаны выполняться параллельно.
Concurrency же рассматривает как раз вопросы параллельного выполнения, и возникающие в связи с этим сложности, видимость, целостность, и тдНу видимость не гарантирована и на одноядерном процессоре. Отличие одноядерного процессора от многоядерного заключается в том, что не надо парится о когерентности кэшей. Но все остальное остается на своих местах - кэширование в регистрах, out-of-order execution, и т.д..
...
Рейтинг: 0 / 0
15.04.2014, 11:17
    #38615089
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
DEVcoach,

я из без таких выражений, как "когерентности кэшей" верю, что ты разбираешься в этой теме)

но можно ж как-то почеловечнее выражаться)
...
Рейтинг: 0 / 0
15.04.2014, 12:47
    #38615180
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
DEVcoachзабыл никне совсем, multithreading он же возможен и на одном ядре. Это способ разбить задачу на юниты, которые могут, но не обязаны выполняться параллельно.
Concurrency же рассматривает как раз вопросы параллельного выполнения, и возникающие в связи с этим сложности, видимость, целостность, и тдНу видимость не гарантирована и на одноядерном процессоре. Отличие одноядерного процессора от многоядерного заключается в том, что не надо парится о когерентности кэшей. Но все остальное остается на своих местах - кэширование в регистрах, out-of-order execution, и т.д..
DEVcoach, А как Вы "паритесь с когерентностью кэшэй" и что такое кэширование в регистрах?
...
Рейтинг: 0 / 0
15.04.2014, 13:07
    #38615210
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
забыл никredwhite90забыл ник,

то есть когда я пишу thread.start() я думаю в основном о multithreading, а когда о wait/notify, то о concurrency ?

не совсем, multithreading он же возможен и на одном ядре. Это способ разбить задачу на юниты, которые могут, но не обязаны выполняться параллельно.
Concurrency же рассматривает как раз вопросы параллельного выполнения, и возникающие в связи с этим сложности, видимость, целостность, и тд
concurrency напрямую не зависит от количества ядер, а оно имеет место, когда 2+ потока обращаются к один и тем же данным (ресурсам).
...
Рейтинг: 0 / 0
15.04.2014, 14:45
    #38615389
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
no56892DEVcoach, А как Вы "паритесь с когерентностью кэшэй"Так же, как и остальные - через acquire/release :-)

no56892и что такое кэширование в регистрах?Оптимизации JITa. Сделайте следующее:

Код: java
1.
2.
3.
4.
5.
6.
7.
String s = null;

// Thread 1
while (s == null) {
    // Spin.
}
sout(s);


Через некоторое время (напр. через секунду) из другого потока:
Код: java
1.
2.
// Thread 2
s = "not null";


Thread 1 у вас не остановится. Потому что он уже не читает эту переменную ни из памяти, ни из кэша.
...
Рейтинг: 0 / 0
15.04.2014, 15:12
    #38615425
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
DEVcoachno56892DEVcoach, А как Вы "паритесь с когерентностью кэшэй"Так же, как и остальные - через acquire/release :-)


no56892и что такое кэширование в регистрах?Оптимизации JITa. Сделайте следующее:

Код: java
1.
2.
3.
4.
5.
6.
7.
String s = null;

// Thread 1
while (s == null) {
    // Spin.
}
sout(s);


Через некоторое время (напр. через секунду) из другого потока:
Код: java
1.
2.
// Thread 2
s = "not null";


Thread 1 у вас не остановится. Потому что он уже не читает эту переменную ни из памяти, ни из кэша.

Вы шутите что-ли? : )
...
Рейтинг: 0 / 0
15.04.2014, 15:31
    #38615461
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
no56892Вы шутите что-ли? : )В чем именно?
...
Рейтинг: 0 / 0
15.04.2014, 15:35
    #38615471
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
no56892concurrency напрямую не зависит от количества ядер, а оно имеет место, когда 2+ потока обращаются к один и тем же данным (ресурсам).

Молодец, сразу видно что прочитал первый ответ в этой теме
...
Рейтинг: 0 / 0
15.04.2014, 15:55
    #38615526
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
DEVcoachno56892Вы шутите что-ли? : )В чем именно?
Ну в том, что Ваш пример работает как и надо, т.е. полностью противоположно тому, что Вы написали. И, если есть, можно еще парочку примеров по управлению кэшем процессора из джавы.


авторМолодец, сразу видно что прочитал первый ответ в этой теме
Пропустил. Но, кстати в 4м Вашем же ответе все-таки уже не так однозначно как в первом, даже наоборот...
...
Рейтинг: 0 / 0
15.04.2014, 16:05
    #38615549
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
no56892Ну в том, что Ваш пример работает как и надо, т.е. полностью противоположно тому, что Вы написали. И, если есть, можно еще парочку примеров по управлению кэшем процессора из джавы.Ну вы бы меньше упражнялись в умении язвить, а больше писали по сути :-) Кэшами из Java не управляют. Из Java управляют видимостью изменений, используя acquire/release семантику. А эта семантика, в свою очередь:
1) Накладывает ограничения на оптимизации JIT.
2) Порождает барьеры памяти, которые приводят к синхронизации кэшей по определнным правилам. Это и есть, как вы выразились "управление кэшами из Java".

Ну а про пример кода, запустите вот это:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Runner {
    private static String s;

    public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {
            @Override public void run() {
                while (s == null) {
                    // No-op.
                }

                System.out.println("2: String change observed: " + s);
            }
        }).start();

        Thread.sleep(1000);

        s = "str";

        System.out.println("1: String changed.");
    }
}

И скажите, остановилась ли у вас программа самостоятельно, или нет. Как минимум пользователи Windows дадут вам отрицательный ответ.
...
Рейтинг: 0 / 0
15.04.2014, 16:28
    #38615601
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
В данном случае - "проделки JIT", если чуть изменить цикл, то всё работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Runner {
    private static String s;

    public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {
            @Override public void run() {
                while (s == null) {
                    Thread.currentThread().yield(); // disable loop unrolling, as I understand
                }

                System.out.println("2: String change observed: " + s);
            }
        }).start();

        Thread.sleep(1000);

        s = "str";

        System.out.println("1: String changed.");
    }
}
...
Рейтинг: 0 / 0
15.04.2014, 16:29
    #38615605
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Basil A. SidorovВ данном случае - "проделки JIT оптимизатора"
...
Рейтинг: 0 / 0
15.04.2014, 16:33
    #38615613
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Basil A. Sidorov// disable loop unrolling transformation to while(true);Что-то плохо соображаю.
...
Рейтинг: 0 / 0
15.04.2014, 16:37
    #38615624
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Basil A. SidorovВ данном случае - "проделки JIT", если чуть изменить цикл, то всё работаетнемножко усложним код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
import sun.misc.*;

import java.lang.reflect.*;
import java.security.*;

public class Runner {
    private static int s;

    private static int s0;

    private static int control;

    private static final Unsafe UNSAFE;

    private static final Object BASE;
    private static final long OFFSET;

    static {
        UNSAFE = unsafe();

        try {
            BASE = UNSAFE.staticFieldBase(Runner.class.getDeclaredField("s"));
            OFFSET = UNSAFE.staticFieldOffset(Runner.class.getDeclaredField("s"));
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {
            @Override public void run() {
                while (s == 0) {
                    s0 = UNSAFE.getInt(BASE, OFFSET);

                    control++;
                }

                System.out.println("2: change observed: " + s);
            }
        }).start();

        Thread.sleep(1000);

        s = 1;

        System.out.println("1: changed.");

        while (true) {
            Thread.sleep(1000);

            System.out.println("1: What 2 saw through Unsafe: " + s0);
            System.out.println("1: Control: " + control);
        }
    }

    public static Unsafe unsafe() {
        try {
            return Unsafe.getUnsafe();
        } catch (SecurityException ignored) {
            try {
                return AccessController.doPrivileged
                    (new PrivilegedExceptionAction<Unsafe>() {
                        @Override
                        public Unsafe run() throws Exception {
                            Field f = Unsafe.class.getDeclaredField("theUnsafe");
                            f.setAccessible(true);
                            return (Unsafe) f.get(null);
                        }
                    });
            } catch (PrivilegedActionException e) {
                throw new RuntimeException("Cannot get Unsafe.");
            }
        }
    }
}


Из него мы видим, что цикл никуда не делся, так как control постоянно изменяется. Однако изменения мы не видим даже через Unsafe.
...
Рейтинг: 0 / 0
15.04.2014, 16:41
    #38615633
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Basil A. SidorovЧто-то плохо соображаю.Контрольное чтение через Unsafe в s0 показывает, что поток не видит изменения значения, независимо от того, что там с условием цикла.
...
Рейтинг: 0 / 0
15.04.2014, 16:48
    #38615645
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Вот, что yield животворящий делает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
>for /l %A in (0 1 4) do @java Runner
1: String changed.
2: String change observed: str
3: Control is: 9610699
1: String changed.
2: String change observed: str
3: Control is: 9759170
1: String changed.
2: String change observed: str
3: Control is: 9740589
1: String changed.
2: String change observed: str
3: Control is: 9606518
1: String changed.
2: String change observed: str
3: Control is: 9703600

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class Runner {
    private static String s;
    private static int control;

    public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {
            @Override public void run() {
                while (s == null) {
                    Thread.currentThread().yield();
                    control++;
                }

                System.out.println("2: String change observed: " + s);
                System.out.println("3: Control is: " + control);
            }
        }).start();

        Thread.sleep(1000);

        s = "str";

        System.out.println("1: String changed.");
    }
}

...
Рейтинг: 0 / 0
15.04.2014, 16:54
    #38615655
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
Я бы сказал, что махинации с многопоточностью опасны не только из-за неопределённостью с процами, но и зависимостью от планировщиков операционных систем.
Так что - ну их нах.
...
Рейтинг: 0 / 0
15.04.2014, 17:03
    #38615677
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Concurrency Vs multithreading
DEVcoachBasil A. SidorovЧто-то плохо соображаю.Контрольное чтение через Unsafe в s0 показывает, что поток не видит изменения значения, ...
Та ну?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
import sun.misc.*;

import java.lang.reflect.*;
import java.security.*;

public class Go {
    private static int s;

    private static int s0;

    private static int control;

    private static final Unsafe UNSAFE;

    private static final Object BASE;
    private static final long OFFSET;

    static {
        UNSAFE = unsafe();

        try {
            BASE = UNSAFE.staticFieldBase(Go.class.getDeclaredField("s"));
            OFFSET = UNSAFE.staticFieldOffset(Go.class.getDeclaredField("s"));
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {
            @Override public void run() {
                while (s == 0) {
                		try {
											Thread.sleep(1);
										} catch (InterruptedException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										}
										
                    s0 = UNSAFE.getInt(BASE, OFFSET);

                    control++;
                }

                System.out.println("2: change observed: " + s);
            }
        }).start();

        Thread.sleep(1000);

        s = 1;

        System.out.println("1: changed.");

        while (true) {
            Thread.sleep(1000);

            System.out.println("1: What 2 saw through Unsafe: " + s0);
            System.out.println("1: Control: " + control);
        }
    }

    public static Unsafe unsafe() {
        try {
            return Unsafe.getUnsafe();
        } catch (SecurityException ignored) {
            try {
                return AccessController.doPrivileged
                    (new PrivilegedExceptionAction<Unsafe>() {
                        @Override
                        public Unsafe run() throws Exception {
                            Field f = Unsafe.class.getDeclaredField("theUnsafe");
                            f.setAccessible(true);
                            return (Unsafe) f.get(null);
                        }
                    });
            } catch (PrivilegedActionException e) {
                throw new RuntimeException("Cannot get Unsafe.");
            }
        }
    }
}



PS. А зачем делать бесконечные циклы без sleep(1)? У вас же загрука ЦП 100% тогда
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Concurrency Vs multithreading / 25 сообщений из 130, страница 1 из 6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]