你get方法里的while(true)一直在运行使得第一个线程一直占着这个对象的锁,
这时你用另一个线程调用这个对象的另一个同步方法,当然获取不了这个对象的锁,
所以你加上synchronized之后不出错也没输出,如果去掉get()方法 里的while(true),如下- public synchronized void get(){
- if(i%2==0){
- name="zs";
- try{Thread.sleep(1);}catch(Exception e){}
- sex="male";
- }else{
- name="lg";
- sex="famale";
- }
- i=(i+1)%2;
- }
复制代码 这个时候就没问题了。
另外,当你去掉put()方法synchronized之后,那put()就是一个普通方法,这时第二个线程是可以调用这个对象的非同步方法的,所以就如你看到的结果一样了。 |