Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / synchronized: не понимаю чего-то элементарного. Поможите, плз. / 5 сообщений из 5, страница 1 из 1
31.07.2013, 21:01:40
    #38350833
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronized: не понимаю чего-то элементарного. Поможите, плз.
hi.
Код: 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.
public class SyncTest01 {
    public static void main(String[] args) {
        Semaphore s1 = new Semaphore();
        Semaphore s2 = new Semaphore();
        Thread t1 = new Thread(s1);
        Thread t2 = new Thread(s2);
        t1.start();
        t2.start();        
    }
    
    static class Semaphore implements Runnable {
        @Override
        public void run() {
            long tid = Thread.currentThread().getId();
            doingAlone(tid);
        }
        private synchronized void doingAlone(long tid) {
            System.out.println( tid+" - intro sync code");
            try {
                System.out.println( tid+" - take some sleep. . .");
                Thread.sleep(1000);
            } catch(InterruptedException x) {
                System.out.println(tid+" has been INTERRUPTED!");
            }            
            System.out.println( tid+" - exit sync code");
        }
    }
} // end of class SyncTest01



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Output:
======
8 - intro sync code
8 - take some sleep. . .
 9 - intro sync code  // как он сюда влез ??
9 - take some sleep. . .
9 - exit sync code
8 - exit sync code
...
Рейтинг: 0 / 0
31.07.2013, 21:10:13
    #38350840
iMove
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronized: не понимаю чего-то элементарного. Поможите, плз.
1) Добавьте к методу модификатор static, и все заработает.
2) Почему? Потому, что в вашем случае монитором является сам объект. Соответственно, у вас два разных объекта => два разных монитора => синхронизации нет. А в static методах монитором является класс. А класс у ваших объектов один и тот же => один монитор => синхронизация есть.
...
Рейтинг: 0 / 0
31.07.2013, 21:10:34
    #38350841
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronized: не понимаю чего-то элементарного. Поможите, плз.
Если бы это был статик метод, то было бы удивительно, а так - вполне естественно
...
Рейтинг: 0 / 0
31.07.2013, 21:16:00
    #38350849
iMove
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronized: не понимаю чего-то элементарного. Поможите, плз.
Вот несколько примеров, из тренинга, который я готовлю по многопоточности:

Один монитор:
Код: 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.
package com.name.j001_x1.ru._01_synchronized;

import com.name.*;

public class CriticalSectionMethodOneObjectExample {
    private static class Monitor {
        private final String name;

        private Monitor(String name) {
            this.name = name;
        }

        private synchronized void criticalSection() {
            doWork();
        }

        /**
         * This method has the same semantics as the one above. Uncomment to check that.
         */
//        private void criticalSection() {
//            synchronized (this) {
//                doWork();
//            }
//        }

        private void doWork() {
            System.out.println("Enter critical section [thread=" + Thread.currentThread().getName() + ", monitor=" +
                name + ']');

            Utils.sleep(100);

            System.out.println("Exit critical section  [thread=" + Thread.currentThread().getName() + ", monitor=" +
                name + ']');
        }
    }

    public static void main(String[] args) {
        int threadCnt = 4;

        final Monitor monitor = new Monitor("monitor");

        for (int i = 0; i < threadCnt; i++) {
            new Thread(new Runnable() {
                @Override public void run() {
                    while (true) {
                        monitor.criticalSection();

                        // Without this we could face starvation due to barging.
                        Utils.sleep(10);
                    }
                }
            }).start();
        }
    }
}


Много мониторов:
Код: 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.
package com.name.j001_x1.ru._01_synchronized;

import com.name.*;

/**
 *
 */
public class CriticalSectionMethodMultipleObjectsExample {
    private static class Monitor {
        private final String name;

        private Monitor(String name) {
            this.name = name;
        }

        private synchronized void criticalSection() {
            System.out.println("Enter critical section [thread=" + Thread.currentThread().getName() + ", monitor=" +
                name + ']');

            Utils.sleep(100);

            System.out.println("Exit critical section  [thread=" + Thread.currentThread().getName() + ", monitor=" +
                name + ']');
        }
    }

    public static void main(String[] args) {
        int threadCnt = 4;

        for (int i = 0; i < threadCnt; i++) {
            final int idx = 0;

            new Thread(new Runnable() {
                @Override public void run() {
                    Monitor monitor = new Monitor("monitor-" + idx);

                    while (true)
                        monitor.criticalSection();
                }
            }).start();
        }
    }
}

...
Рейтинг: 0 / 0
31.07.2013, 21:18:13
    #38350854
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
synchronized: не понимаю чего-то элементарного. Поможите, плз.
спасибо, получилось.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / synchronized: не понимаю чего-то элементарного. Поможите, плз. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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