Как работает Синхронизированный? - PullRequest
0 голосов
/ 16 ноября 2011

Мне действительно не нравится публиковать несколько вопросов сразу, извините, если это раздражает.

Мне наконец-то удалось решить мою проблему. За исключением того, что я не уверен, является ли это надежным или даже мудрым.

   public void run() {
            // TODO Auto-generated method stub


            float time = 0.01f;
            try {
                while(time < timer)
                {
                       time+=0.1f;
                                       Thread.sleep(100);
                }

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        synchronized (ProgressBar.class) {
            int val =++ProgressBar.threadCount;
            if(val == 10)
            {
                                System.out.println("All threads are finished!") ;
            }
        }

    }
}

Я тестирую уже 5 минут, и это похоже на работу. Но кто-то может объяснить, что происходит? Когда поток запускается, он гарантирует, что синхронизированный блок не используется, в противном случае он ожидает его завершения. Так это какая-то система очередей? Еще раз спасибо. EDIT:

Предыдущие ссылки Как работает AtomicInteger?

Thread.join замораживает индикатор выполнения

1 Ответ

1 голос
/ 16 ноября 2011
Блок

A synchronized использует блокировку объекта, на который он ссылается, в вашем случае ProgressBar.class.Если никакой другой поток не владеет блокировкой, блок synchronized получает ее и продолжает работу.Если блокировка уже принадлежит другому потоку, блок synchronized переходит в спящий режим в ожидании снятия блокировки, после чего он пытается снова.Как только поток, которому принадлежит блокировка, завершает работу с блоком synchronized, он снимает блокировку, в результате чего хотя бы один из потоков, ожидающих блокировку, попытается получить ее.

(Это объяснение пропускаетвероятность того, что один и тот же поток может получить блокировку несколько раз, прежде чем снимать ее. Если поток владеет блокировкой хотя бы один раз, все другие потоки блокируются для ее получения.)

См. JavaСпецификация языка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...