Возникло несколько вопросов по теме synchronized.
Вопрос 1 Предположим, у нас есть объект класса, в коде которого изменяется строка как предложено ниже. public class Exxample1 extends Thread{ public String stroka; public void run() { <...> stroka=stroka+" "; //(1) <...> synchronized(stroka) { stroka=stroka+" "; } } } Объект этого класса одновременно используют сразу несколько нитей. Первая нить добралась до блока synchronized и заблокировала строку. Это значит, что все другие нити
  • не смогут зайти внутрь этого блока, пока первая нить не закончит свою работу в нем (заснут)
  • не смогут использовать строку stroka, где бы ее не вызвали(заснут). То есть команда (1) не будет выполнена пока первая нить не выйдет из блока.
  • оба пункта
  • другое
Вопрос 2 У нас есть объект класса, который используется одновременно несколькими нитями (код класса ниже) public class Example2 extends Thread { public void run() { <...> synchronized(this) { <...> } } } Какие утверждения, приведенные ниже верны. Когда одна из нитей заходит в блок synchronized...
  • все остальные нити, которые уже работают с этим объектом заснут
  • нити, уже использующие этот объект продолжат свою работу, но новые будут ждать разблокировки объекта (заснут)
  • все нити, использующие этот объект или только собирающиеся его использовать заснут (объединение первых двух пунктов)
  • другое
Вопрос 3 Ниже приведен код класса, объект которого используется несколькими нитями одновременно. public class Example3 extends Thread { public String s; public int k; private String word; public void run() { <...> synchronized (s) { <...> } <...> synchronized (this) { <...> } } } Одна из нитей заходит в первый блок synchronized и блокирует строку. В этот момент другая нить заходит во второй блок и пытается заблокировать весь объект, но строка s уже заблокирована. Что же произойдет?
  • вторая нить все равно заблокирует весь объект, первая - заснет
  • вторая нить все равно заблокирует весь объект, первая продолжит свою работу (а что тогда с s? будет использоваться обеими нитями или заблокирована для всех?)
  • вторая нить заснет, будет ждать выхода первой нити из блока
  • другое
Вопрос 4 Если использовать synchranized в описании метода, то когда нить вызовет этот метод, все треды, использующие объект, в котором описан данный метод, заснут? (Вроде ответ должен быть аналогичен ответу 2ого вопроса) Спасибо за ваши ответы. Тема, действительно, сложная и несколько мутная. Надеюсь на ваше понимание. Кстати, можете подкинуть доп. ссылок или литературы на эту тему (коме уже указанных в JavaRush).