2014-10-02 2 views
2

Я знаком с основным механизмом java-потоков, однако запутался в одном конкретном случае. Ниже приведен пример кода.java - блок синхронизации по байт []

static byte[] syncBuf; 

// synchronized block of code 
synchronized(syncBuf) { 
    // Call non-synchronized method 
    methodA(syncBuf); 
} 

Мой вопрос, если несколько потоков выполнить приведенный выше код, будет следующий блок поток до Methoda() осуществляется выполнение, так как мы проводим блокировку syncBuf, который передается по ссылке.

EDIT:

Что произойдет, если я изменю выше код с ниже:

static byte[] syncBuf; 

// synchronized block of code 
synchronized(syncBuf) { 
    // Call non-synchronized method in a new thread 
    new Thread(new Runnable() { 
    @Override 
    public void run() { 
     methodA(syncBuf); 
    }}).start(); 
} 

бы выше интерпретация еще держать? Будет ли следующий поток блокировать до выполнения методаA() - потока?

ответ

3

Ваша интерпретация (в основном) правильная. Любой другой поток, вызывающий этот код, будет блокироваться до тех пор, пока поток не выйдет из синхронизированного блока (который немного после возврата методаA).

В Java массивы также являются объектами, на которые можно синхронизировать.

Вы всегда можете экспериментировать и попробовать его, чтобы проверить, либо с помощью отладчика или с разумным использованием функции Thread.sleep, чтобы увидеть, если другие потоки могут получить.

Ваша правка это совершенно другой случай хотя - здесь ваш основной поток блокируется на syncBuf, запускает поток, а затем освобождает блокировку. Этот поток не получает блокировку (внутри run()), поэтому вызов methodA(syncBuf) не получает никаких блокировок или блокировки. Это было бы так же, как если бы анонимный экземпляр Runnable был определен в другом месте (например, в своем классе).

+0

Да, я пробовал делать все это. Однако syncBuf не запутывается, и вызывающий поток не блокируется в течение длительного времени перед входом в синхронизированный блок кода. Не знаете, как это проверить. – pree

+0

Вышеупомянутый комментарий для моего отредактированного вопроса. Однако я могу проверить это в первом случае. В первом случае вызывающие потоки блокируются. – pree

1

Относительно ваша правка

бы еще держать выше толкование? Будет ли следующий блок нити до тех пор, пока метод A() - нить не будет выполнена?

No.

создается новый поток, который вызывающую methodA асинхронно. С точки зрения текущей нити, т.е. тот, которому принадлежит блокировка на syncBuf, вы вызвали метод Thread#start(), который немедленно возвращается и вышел из блока , освободив блокировку.

0

Оба вышеуказанных ответа Криса и Сотириоса Делиманолиса правильны. Я просто обозначил это как ответ, который охватывает оба случая.

Смежные вопросы