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呢?
希望各位大佬能帮助我这个菜鸡,谢谢。
1、num不是共享的全局变量,你大概理解成单例模式了,但这里要引入缓存的概念,你就直接当做每个线程第一次读取了num后直接缓存为5,然后进行计算,系统随机调起线程。另外自增和自减不具有原子性。
2、锁机制要自己设置啊。。。上synchronized 上volatile
3、解决方法
4、相关建议: