首页 > 解决方案 > 在多个线程之间共享对象

问题描述

无法获得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

请让我知道我的代码有什么问题。

标签: javamultithreadingthread-safetysemaphore

解决方案


代码不共享Integer实例。count++相当于:

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

即,因此您将新实例重新分配给局部变量count。实例本身没有改变(确实Integer是不可变类型)。

在多线程场景中,使用AtomicInteger.

旁注:你几乎总是不应该调用Integer构造函数,总是使用Integer.valueOf(int).


推荐阅读