Возникло несколько вопросов по теме 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? будет использоваться обеими нитями или заблокирована для всех?)
- вторая нить заснет, будет ждать выхода первой нити из блока
- другое
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Вопрос 1.
1 они не заснут а попадут в blocked set
2 т.к. public String stroka; следовательно другие нити
могут изменять строку.
3 не подходит
4 другое это правильный ответ.
Вопрос 2.
Заснут как по мне неверное трактование работы синхронайзед.
Thread.sleep(milis) поток засыпает.
Syncronized — поток может попасть в Blocked состояние
где он не run но alive, blocked состояние — будет ждать нужный ресурс.
4. Ответ другое. Т.к. как минимум слово заснут неправильно.
Как работает монитор по обьекту.
Если один поток захватил обьект. Все все остальные потоки будут
blocked. Тоесть ждать пока поток выйдет из syncronized блока и отпустит
монитор
Вопрос 3.
4. Другое.
Правильный ответ в данном случае может быть как минимум
2 варинта.
NullPointerException выбросится т.к. public String s не инициализирован.
Плюс. Т.к. publuc String s имеет модификатор public и поле не финальное к
нему могут получить доступ другие потоки изменить его или еще что
в итоге что получится тяжело узнать.
Если переменна s инициализирована — тогда МОЖЕТ получится либо deadlock
либо Nothing can be said for sure.
Вопрос 4.
Нет не заснут. Переместятся в blocked set где будут ждать освобождения
монитора. Если не брать в расчет wait/notify методы когда под
syncronized блоком может быть несколько потоков.
A synchronized method cannot be executed simultaneously by more than one thread on the same object.
In which of the following cases a thread will definitely be alive but not be running?
The thread is trying to enter a synchronized block and the monitor is not free.
The thread is sleeping as a result of a call to the sleep( ) method.
Лучшие книги по Java Core Это любые книги по подготовке к тестированию.
Sun Certified Programmer for Java 6 Katt
PS Я везде использовал «заснут», тк данное понятие использовалось в лекциях. Хотя ты, конечно, прав, не заснут, а заблокируются
Синхронизация помогает потокам получить правильно доступ к общим ресурсам.