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)........输出结果怎么会这样?
6 回答
已采纳
暧月的猫
TA贡献6条经验 获得超0个赞
因为你Mythread类里有一句话;
Mythread i=new Mythread();
意思就是说 你的每个Mythread对象里有一个Mythread类型的对象的属性。而那个属性Mythread类型里又包含一个Mythread对象,这样死循环下去。你的计算机就崩溃了(什么时候是个头啊)
你的Mythread i;主要是用来做锁的,你可以用this来做锁,这样对象内部的语句不会冲突。但是汪汪和喵喵就可以同时洗澡了,应该不是你想要的结果。其实你应该定义一个澡堂类,里面有一个洗澡方法。洗澡方法用this加锁。定义汪汪和喵喵线程,两个线程run方法里调用澡堂洗澡方法。
迷茫_先森
TA贡献1条经验 获得超0个赞
class Mythread implements Runnable{
Mythread i=new Mythread();//同步的标记对象
你这样不就一直去new了... 然后都栈溢出了
添加回答
举报
0/150
提交
取消