为了账号安全,请及时绑定邮箱和手机立即绑定

同步线程与死锁

同步线程与死锁

陳高高_ 2015-03-16 11:09:08
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方法里调用澡堂洗澡方法。

查看完整回答
反对 回复 2015-03-16
?
慕娘1402314

TA贡献1条经验 获得超0个赞

我也不知道是哪里出错了

查看完整回答
反对 回复 2015-03-17
?
Coda

TA贡献32条经验 获得超5个赞

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

查看完整回答
反对 回复 2015-03-16
?
迷茫_先森

TA贡献1条经验 获得超0个赞

class Mythread implements Runnable{

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


你这样不就一直去new了... 然后都栈溢出了

查看完整回答
反对 回复 2015-03-16
?
修缘

TA贡献1条经验 获得超0个赞

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

查看完整回答
反对 回复 2015-03-16
?
陳高高_

TA贡献2条经验 获得超0个赞

不知道是哪里出错了耶

查看完整回答
反对 回复 2015-03-16
  • 6 回答
  • 1 关注
  • 2018 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信