首页 新闻 会员 周边 捐助

java 同步问题,各路大神帮我分析下为什么这样做就不能锁了? 谢谢解答~!

0
悬赏园豆:10 [已解决问题] 解决于 2016-10-12 12:15

public class ThFF {
public synchronized void ni(){
for(int s=0;s<100;s++)
{
System.out.println(Thread.currentThread().getName()+ " "+s);
}
}
}

 

public class RN implements Runnable{
public void run(){
ThFF r=new ThFF();
r.ni();
}
}

 

public class nihao {
public static void main(String s[]){
RN tr=new RN();
Thread TR1=new Thread(tr);
Thread TR2=new Thread(tr);
TR1.start();
TR2.start();
}
}

梦再笑的主页 梦再笑 | 初学一级 | 园豆:55
提问于:2016-10-11 23:20
< >
分享
最佳答案
-1

锁呢? 锁呢? 

收获园豆:10
吴瑞祥 | 高人七级 |园豆:29449 | 2016-10-11 23:22

我锁在了最上面的那个类上,那个类被实现Runnable的类调用, 两个线程都要通过RN类(即实现Runnable的类)去调用ThFF类(带锁的),这样锁不住,输出还是两个交换执行的。

梦再笑 | 园豆:55 (初学一级) | 2016-10-11 23:29

怎么回事啊?大神帮我解解!谢谢了啊

梦再笑 | 园豆:55 (初学一级) | 2016-10-11 23:46

@梦再笑: 100%是你不明白什么是锁.或者说你不知道你用的这个是什么锁..换个吧.或者查一下这种锁是怎么用的

吴瑞祥 | 园豆:29449 (高人七级) | 2016-10-12 09:28

@吴瑞祥: 我昨天想了好久,终于明白了,我说说我的理解,你帮我分析下看我说的对不对,好吗?

梦再笑 | 园豆:55 (初学一级) | 2016-10-12 11:27

我这个写法,是不是始终无论什么时候总是同一个run()方法在执行的上面那个锁.并没有存在两个不同的对象去访问同步方法?我理解的对吗?

梦再笑 | 园豆:55 (初学一级) | 2016-10-12 11:32

但是,如果我把第二个类中的 ThFF r=new ThFF(); 这个声明创建放在第二个类的全局的位置, 那样就能被锁住了 也就是这样

public class RN implements Runnable{
ThFF r=new ThFF();
public void run(){
r.ni();
}
}

梦再笑 | 园豆:55 (初学一级) | 2016-10-12 11:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册