Java并发性和作用域

Java并发性和作用域,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在学习java和关于线程的知识,并有以下代码: Integer target = (int) (Math.random() * 1000); System.out.println("The number is " + target); Monitor mThread = new Monitor(); mThread.start(); Finder finder1 = new Finder(0,249,target,mThread); Find

我正在学习java和关于线程的知识,并有以下代码:

    Integer target = (int) (Math.random() * 1000);
    System.out.println("The number is " + target);
    Monitor mThread = new Monitor();
    mThread.start();

    Finder finder1 = new Finder(0,249,target,mThread);
    Finder finder2 = new Finder(250,499,target,mThread);
    Finder finder3 = new Finder(500,749,target,mThread);
    Finder finder4 = new Finder(750,1000,target,mThread);

    Thread t1 = new Thread(finder1,"T1");
    t1.start();
    mThread.addThread(t1);
    Thread t2 = new Thread(finder2,"T2");
    t2.start();
    mThread.addThread(t2);
    Thread t3 = new Thread(finder3,"T3");
    t3.start();
    mThread.addThread(t3);
    Thread t4 = new Thread(finder4,"T4");
    t4.start();
    mThread.addThread(t4);
Finder类接受一个范围和一个数字来检查它是否在该范围内。在运行代码时,在Finder中使用Final变量之前,只有最后一组数字用于测试

我以为新的Finder会实例化一个全新的对象,为什么finder1中的变量会在finder4的作用域中改变呢

我以为新的Finder会实例化一个全新的对象,为什么finder1中的变量会在finder4的作用域中改变呢

如果值是实例字段(即非
static
),则
finder4
不应访问
finder1
s字段。说
newfinder(…)
肯定会实例化一个全新的对象


线程的输出是否可能以与预期不同的顺序返回?可能是
finder1
的线程在
finder4
之后开始或结束,因此您在最后看到的只是
finder1
的结果。

是否有一些代码等待线程结束?是否只有具有finder1的线程才有足够的时间在退出程序之前进行计算并打印结果?

Integer是不可变的,因此您必须引用Finder类中的另一个变量


如果没有Finder的代码,很难回答您的错误,但是最好的猜测是您使用一个共享变量来存储目标,然后它们可以相互改变。原始值从未改变,只是在重新分配时丢失了。

显示Finder类的代码。Maurício如是说。问题很明显地出现在
Finder
的实现中;听起来您正在初始化的字段几乎是静态的。