Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация / 6 сообщений из 6, страница 1 из 1
10.10.2014, 10:23
    #38772717
Caboforge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация
Всем привет!
Изучаю синхронизацию в java.

Подскажите плз. Никак понять не могу.
Как такой код может перебрать все числа в разных потоках?
Я так понимаю, данный код должен в 1-м потоке перебрать все значения листа.

А у меня иногда выходит что значения перебираются всем потоками.
Код: 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.
public class ThreadTest extends Thread {

    private static final List<Integer> resultList = new LinkedList<Integer>();

    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            resultList.add(i);
        }

        new ThreadTest().start();
        new ThreadTest().start();
        new ThreadTest().start();
        new ThreadTest().start();
        new ThreadTest().start();
        new ThreadTest().start();

    }

    @Override
    public synchronized void run() {
        int j = 0;
        while (!resultList.isEmpty()) {
            System.out.println(resultList.remove());

            j++;
        }

        System.out.println("result    " + " " + j);
    }   
}
...
Рейтинг: 0 / 0
10.10.2014, 12:13
    #38772968
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация
Caboforge,

потом что, synchronized в описание моетода это то же самое что и
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    @Override
    public void run() {
        synchronized (this) {
            int j = 0;
            while (!resultList.isEmpty()) {
                System.out.println(resultList.remove());

                j++;
            }

            System.out.println("result    " + " " + j);
        }
    }


т.е. синхронизация на сам объект. В вашем случае это всё разные объекты, и этот синхронайз вам как мертвому припарка.
это будет работать, только если все ваши потоку будут дёргать метод одного и того же объекта, с synchronized в описание.
...
Рейтинг: 0 / 0
10.10.2014, 12:21
    #38772981
Caboforge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация
DDiver,
Спасибо!!!
...
Рейтинг: 0 / 0
10.10.2014, 16:42
    #38773492
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация
Caboforge, в учебных примерах авторы стремяться как можно сильнее
указать на "столкновения" потоков. Дидактический подход. Вы должны
увидеть факт коллизий или захвата мутексов.

В реальности этого нужно избегать любыми способами. Самое худшее
приложение - это подобные учебные примеры.

Самое лучшее приложение - разделение данных так чтобы они вообще
не шарились. Лучше на уровне ТЗ.
...
Рейтинг: 0 / 0
11.10.2014, 00:38
    #38773871
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация
Caboforge,

Вы обращаетесь сразу из множества потоков к одному LinkedList, который не является потокобезопасным. Так делать нельзя - потоки имеют право не видеть изменений (или части изменений) этого LinkedList.

final тут не гарантирует вообще ничего из того что вам нужно.
...
Рейтинг: 0 / 0
13.10.2014, 17:31
    #38775442
Caboforge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация
Всем большое спасибо!!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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