複数のスレッド間でオブジェクトを共有

Priyatamロイ:

正確な値を得ることができない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

私は私のコードと間違っているものを教えてください。

M Anouti:

コードが共有されていないIntegerインスタンスを。count++と同等です。

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

すなわちローカル変数に新しいインスタンスを再割り当てしますのでcountインスタンス自体が(実際に変化しないInteger不変タイプです)。

マルチスレッドのシナリオでは、それを使用する方がよいかもしれませんAtomicInteger

サイドノート:あなたはほとんど常に起動するべきではありませんInteger使用し、常に、コンストラクタをInteger.valueOf(int)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=361705&siteId=1