Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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 - Fatal编程技术网

下面两个多线程java代码之间的区别是什么?

下面两个多线程java代码之间的区别是什么?,java,multithreading,Java,Multithreading,想知道下面两个代码之间的区别吗 我的第一个代码是 package com.app.myclasses; class RunnableTest implements Runnable { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5; i++) { System.out.println(i)

想知道下面两个代码之间的区别吗
我的第一个代码是

package com.app.myclasses;

class RunnableTest implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub

        for (int i = 0; i < 5; i++) {
            System.out.println(i);
        }
    }
}
public class ThreadTesting {
    public static void main(String[] args) {
        RunnableTest r1 = new RunnableTest();
        Thread t1 = new Thread(r1, "first");
        t1.start();
        Thread t2 = new Thread(r1, "second");
        t2.start();
    }
}  
package com.app.myclasses;
类RunnableTest实现Runnable{
@凌驾
公开募捐{
//TODO自动生成的方法存根
对于(int i=0;i<5;i++){
系统输出打印LN(i);
}
}
}
公共类线程测试{
公共静态void main(字符串[]args){
RunnableTest r1=新的RunnableTest();
螺纹t1=新螺纹(r1,“第一”);
t1.start();
螺纹t2=新螺纹(r1,“第二”);
t2.start();
}
}  
在上面的代码中,我仅使用一个可运行实例创建了两个线程
现在看看下面的代码

package com.app.myclasses;
class RunnableTest implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub

        for (int i = 0; i < 5; i++) {
            System.out.println(i);
        }
    }
}
public class ThreadTesting {
    public static void main(String[] args) {
        RunnableTest r1 = new RunnableTest();
        RunnableTest r2 = new RunnableTest();
        Thread t1 = new Thread(r1, "first");
        t1.start();
        Thread t2 = new Thread(r2, "second");
        t2.start();
    }
}  
package com.app.myclasses;
类RunnableTest实现Runnable{
@凌驾
公开募捐{
//TODO自动生成的方法存根
对于(int i=0;i<5;i++){
系统输出打印LN(i);
}
}
}
公共类线程测试{
公共静态void main(字符串[]args){
RunnableTest r1=新的RunnableTest();
RunnableTest r2=新的RunnableTest();
螺纹t1=新螺纹(r1,“第一”);
t1.start();
螺纹t2=新螺纹(r2,“第二”);
t2.start();
}
}  
在第二段代码中,我创建了两个可运行实例r1和r2,并相应地创建了线程

那么,上述两种代码的区别是什么呢?是否存在内存使用问题或性能问题,或者其中一个问题实际上不是多线程

方法局部变量是隐式线程安全的。因此,在您的情况下,这并不重要,因为
i
不是共享的

考虑这样一个案例:

class RunnableTest implements Runnable {

 int i = 0;

@Override
public void run() {
    // TODO Auto-generated method stub

    for (i = 0; i < 5; i++) {
        System.out.println(Thread.currentThread().getName() + " : " + i);
    }
}
上述代码将无法提供正确的输出(0-4两次)。输出类似于:

 first : 0
second : 0
first : 1
second : 2
first : 3
second : 4
这里有实例级字段(共享)。因此,输出不是您所期望的

在另一种情况下,实例级字段不会在线程之间共享。因为您有两个不同的
可运行文件

如果要在可运行实例内进行同步,并且使用了
,则只处理
一个实例
,而不是
两个单独的可运行实例

注意:锁定可运行实例被认为是糟糕的设计。

在第一个示例中,您有一个RunnableTest实例,因此任何实例变量都将由两个线程共享。在第二种情况下,有两个实例,因此线程将只共享静态数据

乙二醇

给予

first Shared static data instance1
second Shared static data instance1
first Shared static data instance1
second Shared static data instance2

给予

first Shared static data instance1
second Shared static data instance1
first Shared static data instance1
second Shared static data instance2

没有区别<代码>RunnableTest不是有状态的。
first Shared static data instance1
second Shared static data instance2