本帖最后由 张洪慊 于 2013-3-18 19:25 编辑
你这个够绕,我分析的加上出现的问题:
加上点代码,看它是怎么执行的:- class Person
- {
- private String name;
- private String sex;
- boolean flag=false;
- public synchronized void set(String name,String sex)
- {
- // System.out.println(Thread.currentThread().getName()+"①---"+flag);
- if(flag)
- {
- // System.out.println(Thread.currentThread().getName()+"②---"+flag);
- this.notify();
- //System.out.println(Thread.currentThread().getName()+"notify---"+flag);
- try{this.wait();}catch(Exception e){System.out.println(e.toString());}
- }
- this.name=name;
- this.sex=sex;
- // System.out.println(Thread.currentThread().getName()+"③---"+flag);
- flag=true;
- //System.out.println(Thread.currentThread().getName()+"④---"+flag);
- }
- public synchronized void print()
- {
- //System.out.println(Thread.currentThread().getName()+"⑤---"+flag);
- synchronized(Person.class) //这里的同步为什么会导致死锁?
- {
- if(flag==false)
- {
- //System.out.println(Thread.currentThread().getName()+"⑥---"+flag);
- this.notify();
- // System.out.println(Thread.currentThread().getName()+"notify"+flag);
- try{this.wait();}catch(Exception e){System.out.println(e.toString());}
- }
- System.out.println(name+"....."+sex+Thread.currentThread().getName());
- flag=false;
- //System.out.println(Thread.currentThread().getName()+"⑦---"+flag);
- }
- }
复制代码
分析下:
1.cpu切换到Thread-1->其中一个输出线程->flag=false->notify(此时没有等待线程)->Thread-1 等待
2.cpu切换到Thread-0->输入线程->flag=false->赋值->执行完set
3.cpu切换到Thread-2->无法进入同步代码块->因为Thread-1等待,该线程依然在同步代码块中->持有Person.class锁
4.cpu切换到Thread-0->此时Thread-0无法执行set->因为Thread-2在同步函数里面,依然持有this锁
以上 卡死- -. |