猿问

同步线程与死锁

package com.同步线程与死锁;


public class threadDemo {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Mythread my=new Mythread();

Thread t1=new Thread(my,"汪汪");

Thread t2=new Thread(my,"瞄瞄");

t1.start();

t2.start();

}


}

class Mythread implements Runnable{

Mythread i=new Mythread();//同步的标记对象

public void run(){

//同步代码块

synchronized(i){

System.out.println(Thread.currentThread().getName()+"正在洗澡");

try{

Thread.sleep(1000);

}catch(InterruptedException e){

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"洗完了");

}

}

}



Exception in thread "main" java.lang.StackOverflowError

at com.同步线程与死锁.Mythread.<init>(threadDemo.java:19)

at com.同步线程与死锁.Mythread.<init>(threadDemo.java:19)

at com.同步线程与死锁.Mythread.<init>(threadDemo.java:19)

........

输出结果怎么会这样?


陳高高_
浏览 2019回答 6
6回答

暧月的猫

因为你Mythread类里有一句话;Mythread i=new Mythread();意思就是说 你的每个Mythread对象里有一个Mythread类型的对象的属性。而那个属性Mythread类型里又包含一个Mythread对象,这样死循环下去。你的计算机就崩溃了(什么时候是个头啊)你的Mythread i;主要是用来做锁的,你可以用this来做锁,这样对象内部的语句不会冲突。但是汪汪和喵喵就可以同时洗澡了,应该不是你想要的结果。其实你应该定义一个澡堂类,里面有一个洗澡方法。洗澡方法用this加锁。定义汪汪和喵喵线程,两个线程run方法里调用澡堂洗澡方法。

慕娘1402314

我也不知道是哪里出错了

Coda

Mythread i=new Mythread();内存溢出了

迷茫_先森

class Mythread implements Runnable{ Mythread i=new Mythread();//同步的标记对象你这样不就一直去new了... 然后都栈溢出了

修缘

Mythread i=new Mythread(); 这个声明,你类都没有创建结束就直接new了

陳高高_

不知道是哪里出错了耶
随时随地看视频慕课网APP

相关分类

Java
我要回答