下面两个多线程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