关于Java多线程的问题 5
初学java,在学到多线程的时候,写了这么段测试程序:publicclassTestThread{publicstaticvoidmain(String[]args){T...
初学java,在学到多线程的时候,写了这么段测试程序:
public class TestThread{
public static void main (String[] args){
Thread1 th1 = new Thread1();
Thread t1 = new Thread(th1);
Thread t2 = new Thread(th1);
t1.setName("Thread1");
t2.setName("Thread2");
t1.start();
t2.start();
}
}
class Thread1 implements Runnable {
Test t = new Test();
public void run(){
t.show();
}
}
class Test {
static int n = 0;
public void show() {
n++;
try{
Thread.sleep(1);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+n);
}
}
输出结果是正确的,即 :
Thread1 2
Thread2 2
当我把Thread.sleep(1);注释掉后,发现输出结果有一种是很奇怪的:
Thread2 1
Thread1 1
这是怎么回事,两个线程不管怎么样,n++都应该执行两次啊,为什么结果是1呢,难道是cpu两个不同的核同时执行了n++? 展开
public class TestThread{
public static void main (String[] args){
Thread1 th1 = new Thread1();
Thread t1 = new Thread(th1);
Thread t2 = new Thread(th1);
t1.setName("Thread1");
t2.setName("Thread2");
t1.start();
t2.start();
}
}
class Thread1 implements Runnable {
Test t = new Test();
public void run(){
t.show();
}
}
class Test {
static int n = 0;
public void show() {
n++;
try{
Thread.sleep(1);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+n);
}
}
输出结果是正确的,即 :
Thread1 2
Thread2 2
当我把Thread.sleep(1);注释掉后,发现输出结果有一种是很奇怪的:
Thread2 1
Thread1 1
这是怎么回事,两个线程不管怎么样,n++都应该执行两次啊,为什么结果是1呢,难道是cpu两个不同的核同时执行了n++? 展开
展开全部
怎么不用synchronized,show()函数被重入了,什么情况都有可能,和sleep没关系。
追问
哦哦,以前没听说过这个词,刚刚百度了一下才知道,谢谢。
那您能不能具体解释一下,为什么会出现Thread1 1 Thread2 1 这种情况呢?也就是为什么静态变量n的值最后是1,程序执行过程中出现了什么样特殊的状况吗?
追答
两个线程独立运行,同时进入show函数,当然就会出现n同时为1的情况了。这和几个cpu没关系。这个函数就是临界区,两个线程不能同时进入,所以就需要synchronized来互斥。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询