嘿,这个问题蛮奇怪!

wtjd 2005-11-30 07:48:53
大家看看下面的代码:
public class TestThread extends Thread{
public String msg = "Hi!";
public synchronized void f1(){
System.out.println("f1!");
}
public synchronized void f2(){
System.out.println("f2!");
}
public synchronized void run(){
this.f1();
this.f2();

}
public static void main(String[] args){
TestThread test1 = new TestThread();
TestThread test2 = new TestThread();
test1.start();
test2.start();
}
}

你猜猜会输出什么?
你肯定会说: 输出f1和f2

告诉你答案是正确的,可是。。。。
我们知道Java的线程在执行时会在有synchronized的函数块所在类加上一把锁,对吧?并且每个对象只有一把锁,只有取得了该对象的锁,才能继续执行它的同步方法,对吧?
在上述代码中 run方法我加上了synchronized,也就是说run方法在执行时,run方法所在的类TestThread就会加上一把锁,此时我在run中调用f1方法,f1方法同样也被synchronized同步了起来,f1方法所在的类也是TestThread,如果我想调用f1的话,我也得取得f1所在类TestThread的锁呀,可是刚才锁不是被run所在的线程占有了吗?同样,f2也一样,

为什么上面还会输出f1和f2呢?不解,真是奇怪!
...全文
274 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtjd 2005-12-13
  • 打赏
  • 举报
回复
理解了,
原来是这样的,
一个类或对象只有一把锁,取得这把锁的线程可以访问该对象或类的资源!
wtjd 2005-12-08
  • 打赏
  • 举报
回复
不好理解
gemouzhi 2005-12-04
  • 打赏
  • 举报
回复
你怎么在run前加起synchronized来了,这种错误的做法只会叫你产生更奇怪的问题。

引用你原话:

“我们知道Java的线程在执行时会在有synchronized的函数块所在类加上一把锁,对吧?并且每个对象只有一把锁,只有取得了该对象的锁,才能继续执行它的同步方法,对吧?”

“f1方法所在的类也是TestThread,如果我想调用f1的话,我也得取得f1所在类TestThread的锁呀,”

------------
建议你先把类和对象的区别看看。
wtjd 2005-12-04
  • 打赏
  • 举报
回复
楼上的兄弟,
象你那样做,编译都通不过啊,
aaa2003gf 2005-12-02
  • 打赏
  • 举报
回复
这个好像和同步无关
wtjd 2005-12-02
  • 打赏
  • 举报
回复
希望高手来帮忙!
liu_you 2005-12-02
  • 打赏
  • 举报
回复
public synchronized void run(){
this.f1();
this.f2();

}
=>
public void run(){
synchronized(this.class)
{
this.f1();
this.f2();
}

}
ahFaye 2005-12-02
  • 打赏
  • 举报
回复
把f1() f2()改成静态的试试
skycncomp 2005-12-01
  • 打赏
  • 举报
回复
但是你并没有同步该类呀
你只是同步了类的方法
也就是在这个类的方法中同一时刻只能有一个线程进入
wtjd 2005-12-01
  • 打赏
  • 举报
回复
还是不理解,
我总觉得线程在执行时是运行run方法,而此时run方法所在的类被加上了锁,因此不能再调用该类的其它方法了,比如f1,f2就应该是不能被调用的?
这样理解有什么不对呢?
wtjd 2005-12-01
  • 打赏
  • 举报
回复
盼解答!
wtjd 2005-12-01
  • 打赏
  • 举报
回复
楼上的,你说要如何同步该类呢?
一个类或其实例只有一个实例,当它的某个方法加上synchronized,被调用 时,该方法所在的实例或类就会加上锁的呀?
SensiblesImon 2005-11-30
  • 打赏
  • 举报
回复
这个不奇怪啊,
F1
F2
F1
F2
监视器要相同才会对多个线程起到监管作用
crazycy 2005-11-30
  • 打赏
  • 举报
回复
没有共享的数据,不同的线程对象的run方法相互不冲突;synchronized应该理解成调用一个对象的被synchronized修饰的方法后,别的不能调用它的其他的synchronized修饰的方法;run方法是线程自身的,而又是不同的两个线程对象,自然不影响
liu_you 2005-11-30
  • 打赏
  • 举报
回复
两个线程之间没有达到同步的条件都!有共享数据?
yuzl32 2005-11-30
  • 打赏
  • 举报
回复
同步有同步方法和同步块,它的锁应该相应的针对方法和块的.

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧