并发基础 - 数据共享对象

时间:2017-06-25 18:10:41

标签: java multithreading concurrency

仍处于学习Java中的oop概念的阶段。在oracle教程here中提供的并发示例中((请耐心等待我快速查看,很容易)),producerconsumerexample类触发producer的两个线程, consumer两者都应通过Drop对象drop交换数据。在这个对象中,他们应该等待/得到彼此的通知。

public class ProducerConsumerExample {
    public static void main(String[] args) {
        Drop drop = new Drop();
        (new Thread(new Producer(drop))).start();
        (new Thread(new Consumer(drop))).start();
    }
}

我不明白的是drop类将producerconsumerexample对象传递给每个线程,它为我们提供了两个新的本地Drop对象,也称为drop两个线程中的每一个都有一个。据我所知,这是因为传入Java是值,而不是引用。因此,每个线程现在都有自己的Drop对象版本,那么为什么它们仍然应该通过相同的原始Drop对象共享数据,因为每个线程都有自己的版本?!

有人请求帮助,我真的非常感激。

2 个答案:

答案 0 :(得分:0)

如果您谈论此示例,并且删除变量 - 它的对象,则在java中,所有对象都按引用传递,而不是按值传递。生产者和消费者使用相同的对象。对于原语传递值

public class ProducerConsumerExample {
    public static void main(String[] args) {
        Drop drop = new Drop();
        (new Thread(new Producer(drop))).start();
        (new Thread(new Consumer(drop))).start();
    }
}

答案 1 :(得分:0)

有点不同。正如你所说,Java是通过值而不是通过引用传递的,但是当我们传递对象的值时,我们将引用传递给它。

一开始可能是一种误解,因为他们决定将对象的位置称为“参考”。

因此Procuder和Consumer保存相同的引用,因此它们正在处理同一个对象。

例如:

class Foo {
     Bar x;
     public Foo(Bar v) { this.x = v; }
     public String getString() { return x.y; }
}
class Bar {
     String y;
     public Bar() {}
}
class Test {
     public static void main(String[] args) {
           Bar x1 = new Bar();
           x1.y = "Test1";
           Foo x2 = new Foo(x1);

           /* the method getString() returns "Test1" */
           System.out.println(x2.getString());

           /* If I change x1.y, x2.getString() returns a different element */
           x1.y = "Test 2";
           System.out.println(x2.getString());

     }
}