Совместное использование объекта между несколькими потоками - PullRequest
1 голос
/ 28 марта 2020

Невозможно получить правильное значение count в потоке писателя. Это всегда 1 в потоке писателя, даже если оно изменяется в потоке читателя.

public class ReaderWriter1 {

    public static void main(String args[]) {

        Semaphore rs = new Semaphore(1);
        Integer count = new Integer(0);

        Thread r1 = new Thread(new Reader("Reader 1", rs, count++));
        Thread w1 = new Thread(new Writer("Writer 1", count));
        w1.start();
        r1.start();
    }
}

class Reader implements Runnable {

    String tName;
    Semaphore rs;
    Integer count;

    Reader(String tName, Semaphore rs, Integer count) {
        this.tName = tName;
        this.rs = rs;
        this.count =  count;
    }

    @Override
    public void run() {
        try {
            read();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    void read() throws InterruptedException {
        while(true) {

            rs.acquire();
            count++;
            rs.release();
            System.out.println("Count in reader: " + count);
            Thread.sleep(1000);
        }
    }

}

class Writer implements Runnable {

    String tName;
    Integer count;

    Writer(String tName, Integer count) {
        this.tName = tName;
        this.count =  count;
    }

    @Override
    public void run() {

        try {
            write();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }

    }

    void write() throws InterruptedException {
        while(true) {
            System.out.println("Count in writer: " + count);
            Thread.sleep(1000);
        }
    }

}

Вывод:

Count in writer: 1
Count in reader: 1
Count in writer: 1
Count in reader: 2
Count in reader: 3
Count in writer: 1
Count in writer: 1
Count in reader: 4
Count in writer: 1
Count in reader: 5
Count in writer: 1
Count in reader: 6
Count in writer: 1
Count in reader: 7
Count in reader: 8
Count in writer: 1
Count in reader: 9
Count in writer: 1

Пожалуйста, дайте мне знать, что не так с моим кодом.

1 Ответ

3 голосов
/ 28 марта 2020

Код не разделяет экземпляр Integer. count++ эквивалентно:

count = Integer.valueOf(count.intValue() + 1);

, т. Е. Поэтому вы заново назначаете новый экземпляр локальной переменной count. Сам экземпляр не изменяется (в действительности Integer является неизменяемым типом).

В многопоточном сценарии ios может быть лучше использовать AtomicInteger.

Примечание: Вы почти всегда не должны вызывать конструктор Integer, всегда используйте Integer.valueOf(int).

...