Синхронизация не работает для ниже простого Java-кода - PullRequest
0 голосов
/ 28 ноября 2018

Я начал изучать многопоточность и синхронизацию в Java и решил заняться практикой.Я написал простой код, в котором у меня есть два синхронизированных метода, объект класса которых используется тремя потоками, но когда я запускаю этот код, синхронизация не работает, я теряю здесь точку?Любая помощь приветствуется.

Runner.java

public class Runner {

private int count;

public synchronized int getCount() {

    return count;

}

public synchronized void setCount(int count) {

    this.count = count;

}

}

ThreadOne.java

public class ThreadOne extends Thread{

Runner r;
int count;

public ThreadOne(Runner r , int count)
{
    this.r=r;
    this.count=count;
}

@Override
public void run()
{
    r.setCount(count);
    System.out.println("count is: "+r.getCount());

}

}

Точно так же у меня есть классы ThreadTwo.java и ThreadThree.java и, наконец, основной класс:

MainRunner.java

public class MainRunner {

public static void main(String[] args)  {
    // TODO Auto-generated method stub

    Runner runner = new Runner();
    ThreadOne one = new ThreadOne(runner, 1);
    ThreadTwo two = new ThreadTwo(runner, 2);
    ThreadThree three = new ThreadThree(runner, 3);

    one.start();
    two.start();
    three.start();


}

}

И вывод, который я получаю,:

count is: 1
count is: 3
count is: 2

Не выглядит синхронизированным.Я знаю, что что-то здесь не хватает, Пожалуйста, дайте мне знать.Заранее спасибо

1 Ответ

0 голосов
/ 28 ноября 2018

Почему нет?Сериализация устанавливается при изменении и чтении значения, что означает, что любые два потока не могут появляться в getCount или setCount методах одного экземпляра Runner,но это не дает ЛЮБЫХ гарантий порядка исполнения, потому что все дело в планировании.Здесь ThreadThree может просто начать свое выполнение первым и установить значение 3, а затем распечатать его, после чего установить значение 2 с помощью ThreadTwo и распечатать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...