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

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

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

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

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

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

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

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

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

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

не совсем, multithreading он же возможен и на одном ядре. Это способ разбить задачу на юниты, которые могут, но не обязаны выполняться параллельно.
Concurrency же рассматривает как раз вопросы параллельного выполнения, и возникающие в связи с этим сложности, видимость, целостность, и тд
concurrency напрямую не зависит от количества ядер, а оно имеет место, когда 2+ потока обращаются к один и тем же данным (ресурсам).
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38615389
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Concurrency Vs multithreading
    #38615425
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Concurrency Vs multithreading
    #38615461
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892Вы шутите что-ли? : )В чем именно?
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38615471
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892concurrency напрямую не зависит от количества ядер, а оно имеет место, когда 2+ потока обращаются к один и тем же данным (ресурсам).

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


авторМолодец, сразу видно что прочитал первый ответ в этой теме
Пропустил. Но, кстати в 4м Вашем же ответе все-таки уже не так однозначно как в первом, даже наоборот...
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38615549
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Concurrency Vs multithreading
    #38615601
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае - "проделки 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
Concurrency Vs multithreading
    #38615605
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВ данном случае - "проделки JIT оптимизатора"
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38615613
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov// disable loop unrolling transformation to while(true);Что-то плохо соображаю.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38615624
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Concurrency Vs multithreading
    #38615633
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovЧто-то плохо соображаю.Контрольное чтение через Unsafe в s0 показывает, что поток не видит изменения значения, независимо от того, что там с условием цикла.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38615645
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, что 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
Concurrency Vs multithreading
    #38615655
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сказал, что махинации с многопоточностью опасны не только из-за неопределённостью с процами, но и зависимостью от планировщиков операционных систем.
Так что - ну их нах.
...
Рейтинг: 0 / 0
Concurrency Vs multithreading
    #38615677
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 130, страница 1 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / Concurrency Vs multithreading
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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