Java 内部类中的线程

Java 内部类中的线程,java,multithreading,Java,Multithreading,此代码没有内部类: class Threads1 implements Runnable { int x = 0; public void run(){ int current = 0; for(int i = 0; i<4; i++){ current = x; System.out.println(current + ", "); x = curre

此代码没有内部类:

class Threads1 implements Runnable { 

    int x = 0; 

    public void run(){ 
        int current = 0; 
        for(int i = 0; i<4; i++){  
            current = x; 
            System.out.println(current + ", ");
            x = current + 2; 
        }  
    }  
} 

public class b{ 

    public static void main(String[] args) {
        Runnable r1 = new Threads1();
        new Thread(r1).start(); 
        new Thread(r1).start(); 
    } 
}
此代码使用名为“Runner”的内部类:

公共类线程1{
int x=0;
公共类运行器实现可运行{
public void run(){
int电流=0;

对于(int i=0;i因为x是共享的,所以它在包含类中。

因为x是共享的,所以它在包含类中。

您的行为没有定义。以线程不安全的方式访问同一字段的线程可能看到或可能看不到相同的值

在第一个示例中,
x
字段被缓存,就好像它是一个局部变量一样。不保证在不同版本的JVM上或编译代码后会发生这种行为


在第二种情况下,您有一个额外的间接级别,这意味着JIT不太可能优化
x
对局部变量的访问。但是,细微的变化可能会看到不同的行为。

您的行为没有定义。以线程不安全的方式访问同一字段的线程可能会或者可能看不到相同的值

在第一个示例中,
x
字段被缓存,就好像它是一个局部变量一样。不保证在不同版本的JVM上或编译代码后会发生这种行为


在第二种情况下,您有一个额外的间接级别,这意味着JIT不太可能优化
x
对局部变量的访问。但是,细微的变化可能会看到不同的行为。

在第一种情况下,
x
是Threads1类的成员,但
Threads1
是单独实例化的在第二种情况下,
x
是外部线程1的成员,因此只创建一个
x
实例。

在第一种情况下,
x
是Threads1类的成员,但
Threads1
b
clas,因此每个线程都有自己的
x
。在第二种情况下,
x
是外部线程1的一个成员,因此只创建了
x
的一个实例。

它们在自己的堆栈上工作,这意味着它们彼此之间不共享任何内容

这是错误的。线程确实有不同的堆栈,但它们共享堆(即所有对象实例及其成员变量所在的内存,只有函数变量位于堆栈上) 而
intx
在堆上只存在一次,因为您只创建了一个
Threads1
对象,并且两个
Runnable
s共享它

您应该将
intx
移动到
Runner
类,并为每个线程创建一个新的
Runner
对象

当我在内部类中使用run()时,两个线程彼此共享“Current”变量


同样错误的是,它们实际上共享
int x
变量,正如前面所解释的。
current
对于每个线程都是唯一的

它们在自己的堆栈上工作,这意味着它们彼此之间不共享任何内容

这是错误的。线程确实有不同的堆栈,但它们共享堆(即所有对象实例及其成员变量所在的内存,只有函数变量位于堆栈上) 而
intx
在堆上只存在一次,因为您只创建了一个
Threads1
对象,并且两个
Runnable
s共享它

您应该将
intx
移动到
Runner
类,并为每个线程创建一个新的
Runner
对象

当我在内部类中使用run()时,两个线程彼此共享“Current”变量


同样错误的是,它们实际上共享
int x
变量,正如前面所解释的。
current
对于每个线程都是唯一的

我刚刚尝试过,在case-first中,即使main()方法在同一个类中..我得到了相同的结果我刚刚尝试过,在case-first中,即使main()也一样方法在同一个类中。我得到了相同的结果好吧,如果它共享堆,那么在第一种情况下,为什么它不共享x的值?逻辑上,它们实际上应该共享x,但请看PeterLawrey的答案来解释这一点好吧,如果它共享堆,那么在第一种情况下,为什么它不共享x的值?逻辑上,它们实际上应该共享x是x,但看看彼得拉维的答案,就可以得到解释
0, 2, 0, 4, 6, 2, 4, 6
public class Threads1 { 
    int x = 0; 
    public class Runner implements Runnable {
        public void run(){  
            int current = 0; 
            for(int i = 0; i<4;i++){ 
                current = x;  
                System.out.println(current + ", "); 
                x = current + 2;  
            }
        }
    }

    public static void main(String[] args) {  
        new Threads1().go();
    }

    public void go(){
        Runnable r1 = new Runner();
        new Thread(r1).start();
        new Thread(r1).start();
    }
}