Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并发基础知识-数据共享对象_Java_Multithreading_Concurrency - Fatal编程技术网

Java 并发基础知识-数据共享对象

Java 并发基础知识-数据共享对象,java,multithreading,concurrency,Java,Multithreading,Concurrency,仍处于学习Java中oop概念的阶段。在oracle教程中提供的并发示例中((请耐心听我说,快速查看一下,很简单)),producerconsumerexample类触发producer和consumer的两个线程,它们都应该通过Drop对象Drop交换数据。在这个对象中,他们应该等待/得到彼此的通知 public class ProducerConsumerExample { public static void main(String[] args) { Drop d

仍处于学习Java中oop概念的阶段。在oracle教程中提供的并发示例中((请耐心听我说,快速查看一下,很简单)),
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();
    }
}
我不明白的是,
producerconsumerexample
类将
drop
对象传递给每个线程,它为我们提供了两个新的本地
drop
对象,也称为
drop
,两个线程中各有一个。据我所知,这是因为传入Java是通过值,而不是引用。因此,每个线程现在都有自己版本的
Drop
对象,既然每个线程都有自己的版本,为什么它们仍然应该通过相同的原始
Drop
对象共享数据


有人请帮忙,我会非常感激的。

如果你谈论这个例子,并且drop变量-它是对象,在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();
    }
}

有点不同。正如您所说,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());

     }
}

对象是通过引用传递的。@Alexei和原语的值传递的?@basheer是。严格地说,引用也是值,所以您可以听到“java中的所有内容都是通过值传递的”。考虑到对象本身从未被视为变量(与C++不同),没有名称,因此根本不能作为参数传递-只有引用可以。原语呢?它们是按值传递的吗?