多线程中synchronized的疑惑

aiyayabunan 2004-12-27 12:42:19
大家帮我看看:

比如thread1,thread2项共同操作一个class a的对象,

class a
{
public synchronized method1()
{
...
}
public synchronized method2()
{
...
}
}

我知道如果thread1正在运行method1方法, synchronized 可以阻止另一进程(比如thread2)进入该方法;但小弟不明白的是如果 thread1正在运行method1方法,这时thread2想访问method2,他有没有权力访问呢?

也就是说,关键字synchronized只是保护一个方法呢?还是说如果某个thread如果进入了一个synchronized方法,则别的线程将不能进入该对象的所有synchronized方法呢?

大家多费心,帮我看看 谢谢
...全文
310 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
likeblood 2005-01-26
  • 打赏
  • 举报
回复
同步的是对象不是方法或类

对于楼主的class a,这个类根本不需要做任何同步,因为你的a里没有任何的成员属性,只有2个方法。当你a a1 = new a();以后,创建对象a1,a1.method1(),将把a1所引用的对象加锁,直到方法执行完毕,这时,如果有线程仍然是a1.method1()或a1.method2(),是不可以的,因为a1所引用的对象已经被锁。但是你要是a a2 = new a();a2.method1()或a2.method2()是可以的,因为你是对a2所引用的对象进行操作,而对a1没有任何影响,能明白我意思吗?

明白就加分吧,我是新人,穷着那。刚问一问题,还没人回答就散了50了。
廖雪峰 2005-01-14
  • 打赏
  • 举报
回复
推荐O'lley的Java Thread一书
jiafcat 2005-01-14
  • 打赏
  • 举报
回复
别的线程将不能进入该对象的<b>所有</b>synchronized方法呢
gaojf810 2005-01-14
  • 打赏
  • 举报
回复
up

不徻写代码 2005-01-12
  • 打赏
  • 举报
回复
up
redex 2005-01-12
  • 打赏
  • 举报
回复
同意:taolei(实在无聊)的说法.
hscartoon 2005-01-11
  • 打赏
  • 举报
回复
java中的所有对象都继承object,所以都具有对象级别锁,如搂住的代码,获得的就是对象级别锁,一旦一个thread操作对象,就会把整个对象锁住,别的thread就不可以操作对象了。一般编程中,不这样用,太粗糙了,参考下面的代码:
class a
{
private x;
private y;
final object o = new Object();
public void method(){
synchromized(o){
access x;
}
synchronized(this){

access x and y;
}
}
}
hscartoon 2005-01-11
  • 打赏
  • 举报
回复
java中的所有对象都继承object,所以都具有对象级别锁,如搂住的代码,获得的就是对象级别锁,一旦一个thread操作对象,就会把整个对象锁住,别的thread就不可以操作对象了。一般编程中,不这样用,太粗糙了,参考下面的代码:
class a
{
private x;
private y;
final object o = new Object();
public void method(){
synchromized(o){
access x;
}
synchronized(this){

access x and y;
}
}
}
cslyaoyao 2005-01-05
  • 打赏
  • 举报
回复
synchronized(this)
{
...
}
也不行,这只能同步当前对象的线程,
你如果想几个不同的实例都排队访问,
应该写成:
synchronized(a.class) //a是你定义的类名
{
...
}
北极猩猩 2005-01-05
  • 打赏
  • 举报
回复
synchronized保护的不是方法,而是this对象,因此是不可以的
knight_yl 2005-01-05
  • 打赏
  • 举报
回复
=
zsh168 2005-01-05
  • 打赏
  • 举报
回复
up
JamesLiu8888 2005-01-05
  • 打赏
  • 举报
回复
关注。
knightseu 2005-01-05
  • 打赏
  • 举报
回复
总的来说,对一个method进行synchronize,实际上相当于对整个类实例synchronize
zyg158 2005-01-05
  • 打赏
  • 举报
回复
学习!
Eddie_chan 2005-01-05
  • 打赏
  • 举报
回复
继续学习啊 JAVA太强大了
icewolf_li 2004-12-27
  • 打赏
  • 举报
回复
对。如果仅仅是需要对对象的某个关键部分进行同步的话,不建议同步整个方法,而只对对象进行同步。
kaymo 2004-12-27
  • 打赏
  • 举报
回复
这个public synchronized method
好像比这个
public method()
{
synchronized(this)
{
...
}
}
有效率些
yubo1209 2004-12-27
  • 打赏
  • 举报
回复
synchronized 可以同步一个类,也可以同步一个方法,象你所说的应该是同步一个方法,就是指一个线程进入了一个同步方法,所以其他线程就只能等待,直到这个线程退出,如果你同步的是这个类,那么其他线程就不能调这个类的任何方法,直到进入的线程退出,

不过强烈推荐,同步方法的做法
catblue 2004-12-27
  • 打赏
  • 举报
回复
顶一下
加载更多回复(1)

62,614

社区成员

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

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