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對象,這樣死循環下去。你的計算機就崩潰了(什么時候是個頭?。?/p>
你的Mythread i;主要是用來做鎖的,你可以用this來做鎖,這樣對象內部的語句不會沖突。但是汪汪和喵喵就可以同時洗澡了,應該不是你想要的結果。其實你應該定義一個澡堂類,里面有一個洗澡方法。洗澡方法用this加鎖。定義汪汪和喵喵線程,兩個線程run方法里調用澡堂洗澡方法。

迷茫_先森
TA貢獻1條經驗 獲得超0個贊
class Mythread implements Runnable{
Mythread i=new Mythread();//同步的標記對象
你這樣不就一直去new了... 然后都棧溢出了
添加回答
舉報
0/150
提交
取消