темы не синхронизируются - PullRequest
1 голос
/ 25 мая 2019

У меня возникла проблема с синхронизацией двух потоков.

Это главное:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        new Thread(new TaskA()).start();
        //Thread.currentThread().sleep(3000);
        new Thread(new TaskB()).start();
    }
}

и это мои два потока, которые увеличивают / уменьшают общую переменную "count"

public class TaskA extends Manager implements Runnable {

    @Override
    public void run() {

        while(true){

        try {
            decrement();
            System.out.println("Thread A: " + getCount());
            Thread.sleep((long) Math.random()%4000);
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
    }
}
public class TaskB extends Manager implements Runnable {
    @Override
    public void run() {
        while(true){
            try {
                increment();

                System.out.println("Thread B: " + getCount());
                Thread.sleep((long) Math.random()%4000);


            }catch(Exception e){
                System.out.println(e.getMessage());
            }
        }
    }
}

Операция управляется этимкласс:

public class Manager {

    private int count=0;

    public synchronized void increment() throws InterruptedException {
        if(count>=0){
            count++;
        }else {
            wait();
            notifyAll();
        }

    }
    public synchronized void decrement()throws InterruptedException {
        //wait();
        if(count <10){
            count--;
        }else {
            wait();
            notifyAll();
        }

    }
    public synchronized int getCount(){
        return count;

    }}

Это вывод, который я ожидаю:

-ThreadA: 1 
-ThreadA: 2
-ThreadA: 3
    .
    .
-ThreadB: 10 
-ThreadB: 9
-ThreadB: 8
    .
    .
-ThreadA: 1 
-ThreadA: 2
-ThreadA: 3
    .
    .

1 Ответ

1 голос
/ 25 мая 2019

Ваш count является переменной экземпляра, как и механизм синхронизации.Если вы хотите поделиться ими между различными экземплярами, они должны быть static:

public class Manager {

    // Made static so that all managers share the same count
    private static int count = 0;

    public void increment() throws InterruptedException {
        // Synchronizing on a resource shared between all instances:
        synchronized (Manager.class) {
            if (count >= 0) {
                count++;
            } else {
                wait();
                notifyAll();
            }
        }
    }

    public void decrement() throws InterruptedException {
        // Synchronizing on a resource shared between all instances:
        synchronized (Manager.class) {
            //wait();
            if (count < 10) {
                count--;
            } else {
                wait();
                notifyAll();
            }
        }
    }

    public int getCount() {
        // Synchronizing on a resource shared between all instances:
        synchronized (Manager.class) {
            return count;
        }
    }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...