创建的线程执行多次Start方法输出结果错误

class MyThread implements Runnable{
    private int num = 5;

    public void run(){
        while(num>0) {
            System.out.println(Thread.currentThread().getName()+"--->"+this.num);
             num--;
        }
    }
}
public class test{
    public static void main(String[] args) {
        MyThread mt1 = new MyThread();
        new Thread(mt1,"Number 1").start();
        new Thread(mt1,"Number 2").start();
    }
}

首先这代码理解很简单,但我在编译运行时,对结果很好奇,如图。但为什么会输出两次5?。这和我在书上看到的答案有出入。

图片描述

我又新起了第三个线程new Thread(mt1,"Number 3").start();,结果又有不同,如图。
图片描述

刚刚学习java,对此抱有疑问。对于这几个线程来说,num不是共享的全局变量吗?其次,这些线程间不应该提供锁机制吗?(我从1234的输出推断出的)那怎么会同时几个线程会访问同一个num呢?

希望各位大佬能帮助我这个菜鸡,谢谢。

阅读 2k
2 个回答

1、num不是共享的全局变量,你大概理解成单例模式了,但这里要引入缓存的概念,你就直接当做每个线程第一次读取了num后直接缓存为5,然后进行计算,系统随机调起线程。另外自增和自减不具有原子性。
2、锁机制要自己设置啊。。。上synchronized 上volatile
3、解决方法

class MyThread implements Runnable{
    private int num = 5;
     // private volatile int num = 5;
    synchronized public void run(){
        while(num>0) {
            System.out.println(Thread.currentThread().getName()+"--->"+this.num);
            num--;
        }
        num=7;//这里是为了示例线程锁
    }
}

4、相关建议:

A、装个IDEA或者Eclipse 
B、看一下《Java多线程编程核心技术》有条件的话最好支持正版
新手上路,请多包涵

1.线程之间并没有自动提供锁这么一说,需要使用java中提供的关键字Sychronized、ReentrantLock类等来实现线程同步。
2.调用start方法只会让线程进入可执行状态,然后CPU会随机调度可执行状态下的线程进行执行。
3.因为是多线程,可能出现线程1先打印完结果,在线程1做减法之前,这时num还没有变化,同时运行的线程2打印了相同的结果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题