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