powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / synchronized: не понимаю чего-то элементарного. Поможите, плз.
5 сообщений из 5, страница 1 из 1
synchronized: не понимаю чего-то элементарного. Поможите, плз.
    #38350833
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
synchronized: не понимаю чего-то элементарного. Поможите, плз.
    #38350840
iMove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Добавьте к методу модификатор static, и все заработает.
2) Почему? Потому, что в вашем случае монитором является сам объект. Соответственно, у вас два разных объекта => два разных монитора => синхронизации нет. А в static методах монитором является класс. А класс у ваших объектов один и тот же => один монитор => синхронизация есть.
...
Рейтинг: 0 / 0
synchronized: не понимаю чего-то элементарного. Поможите, плз.
    #38350841
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если бы это был статик метод, то было бы удивительно, а так - вполне естественно
...
Рейтинг: 0 / 0
synchronized: не понимаю чего-то элементарного. Поможите, плз.
    #38350849
iMove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот несколько примеров, из тренинга, который я готовлю по многопоточности:

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


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