Что такое мьютекс и что такое монитор?

Задался вопросом понять, что есть что. Так как в разных источниках по-разному используют эти термины. И часто даже бывает, что в одной статье что-либо, например, кусок кода, называют монитором, в другой — это называют мьютексом (и бывает наоборот — объект, связанный с данным, и отвечающий на синхронизацию нитей, называют то мьютексом, то монитором). Вот и хочу разобраться, что есть что. (могу, конечно, привести множество цитат из этих источников, где употребляются эти термины, но думаю, это будет избыточно.)
  • ,

Чат (21) Не могу сам додуматься, почему так и как вообще подключиться к какому-то серверу?

Ребят, всем привет. Прохожу большую задачу «Чат», и на 21 подуровне наткнулся на вопрос, который выделен жирным.
5. Переопредели методы в классе ClientGuiController:

а) SocketThread getSocketThread() – должен создавать и возвращать объект типа GuiSocketThread.

б) void run() – должен получать объект SocketThread через метод getSocketThread() и вызывать у него метод run().Разберись, почему нет необходимости вызывать метод run в отдельном потоке, как мы это делали для консольного клиента.
И вот думал-думал, но никак до чего-то стоящего не додумался. Кто уже проходил и знает, почему так? Я конечно уже несколько задач назад сбился с понимания отдельных моментов того, что происходит, но всё же понимаю общую картину и не секу, почему не вызываем отдельный трэд. Хотелось бы разобраться.
Заранее спасибо за ответ.

P.S. Закончил уже задачу, всё прошёл.Но теперь возник вопрос, к какому серверу вообще можно подключиться? Или его можно как-то создать?

Вопросы про synchronized

Возникло несколько вопросов по теме 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).
  • ,

level16.lesson13.bonus02

Такая вот задачка, вроде все пункты выполнены, кто знает в чем дело? ):
Укажите на ошибки, если они есть :)


package com.javarush.test.level16.lesson13.bonus02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/* Клубок
1. Создай 5 различных своих нитей c отличным от Thread типом:
1.1. нить 1 должна бесконечно выполняться;
1.2. нить 2 должна выводить "InterruptedException" при возникновении исключения InterruptedException;
1.3. нить 3 должна каждые полсекунды выводить "Ура";
1.4. нить 4 должна реализовать интерфейс Message, при вызове метода showWarning нить должна останавливаться;
1.5. нить 5 должна читать с консоли цифры пока не введено слово "N", а потом вывести в консоль сумму введенных цифр.
2. В статическом блоке добавь свои нити в List<Thread> threads в перечисленном порядке.
3. Нити не должны стартовать автоматически.
*/

......
}