哪位好汉,能帮小弟解决一下synchronized(object)的问题?谢谢

da1da2_2011 2011-08-24 08:09:34
我明白synchronized(this),这个写法跟synchronized 方法名{}意思差不多,都是说两个线程在同一个时刻不能同一个对象执行被synchronized修饰的方法或者代码段。但是我就不明白synchronized(object)。

所以请问大家synchronized(object)这是在什么时候用的?
括号里面的那个object指的是哪个object啊?
还有,这个object必须是某个类的成员变量么?
...全文
301 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
我在纸上 2011-08-28
  • 打赏
  • 举报
回复
object只是一个锁旗标,表示一个标志,可以是类本身,也可以不是。
求道者 2011-08-25
  • 打赏
  • 举报
回复
学习了
qichao88888 2011-08-25
  • 打赏
  • 举报
回复
给方法加锁和给对象加锁还是有区别的。
方法加锁的话,只要是这个类的对象调用此方法就要等待(如果此类的另一对象正在调用此方法)。
给对象加锁的话,那么只有同一对象(equals)才会造成等待。
同步代码块的大小尽量控制,所以出现了对象加锁。
我是这么理解的,有不对的地方请指明!
daijope 2011-08-25
  • 打赏
  • 举报
回复
Object object = new Object;
然后几个线程共享了这个object,
synchronized(object)就会锁住。
huqifei 2011-08-24
  • 打赏
  • 举报
回复
synchronized(this),这个写法跟synchronized 非静态方法名相同。
synchronized(A.class)跟synchronized 静态方法名相同。


synchronized(object),只要object是个对象就可以
bityoungs 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 da1da2_2011 的回复:]

好汉,这段我知道的,我是说“Synchronized(obj)锁Obj对象,this本身就是一个Object对象,而有时候两个线程持有的this本身就不同,你又想同步,可以通过新建一个两个线程共同拥有的对象锁住
”这句是什么意思啊?能不能在详细点?谢谢
还有Synchronized(obj)到底能起到什么样的特殊效果,在什么时候用Synchronized(obj),什么时候用Synchron……
[/Quote]

this 是obj的一个特例而已。
这里的obj就是一个标志,
你可以想象,obj这个对象有一个字段flag,就是表明有没有线程在后面的一段代码中执行,如果没线程正在执行这段代码就flag = 0,有的话就又flag = 1;
第一个线程执行到synchronized(obj)的时候,还没有别的进程操作过,所以obj的flag = 0,这就是告诉第一个线程,你可以进去啦!然后flag 就设置为1.等这线程执行完这段代码,则把flag 改回为 0.
第二个线程执行到此的时候,如果flag = 1,说明有线程在里面执行,它就堵塞等待,如果flag=0,说明代码空闲,继续往下执行。

所以两个进程看到的一定是同一个对象。


注意! 两个线程看到的一定要是同一个对象

比如 你跟你同学公用一个浴室
他洗澡的时候你不能去洗
你洗澡的时候他不能去洗

为什么呢? 因为你们看到的是同一个浴室的门,也就是同一个对象。
这个门就是这里的对象。

所以能够产生互斥关系的对象一定是两个对象(你跟你同学)都能够看到的,而且必须是同一个东西。
阳明 to life 2011-08-24
  • 打赏
  • 举报
回复
5楼那段代码看懂没,知道为什么两个this不同么
阳明 to life 2011-08-24
  • 打赏
  • 举报
回复
效果上两个效果是一样的,都是通过将同一个对象作为锁,一个线程获取锁时另外一个线程等待在锁上
你也不用分太清楚,只要你知道两个线程调用同一段代码时,如果要同步必须是同一个对象,用成两个对象就不管用了
你写段代码试试就能理解的,这个东西不自己亲自去试很难懂的
如果代码再有问题 贴上来问吧
da1da2_2011 2011-08-24
  • 打赏
  • 举报
回复
好汉,这段我知道的,我是说“Synchronized(obj)锁Obj对象,this本身就是一个Object对象,而有时候两个线程持有的this本身就不同,你又想同步,可以通过新建一个两个线程共同拥有的对象锁住
”这句是什么意思啊?能不能在详细点?谢谢
还有Synchronized(obj)到底能起到什么样的特殊效果,在什么时候用Synchronized(obj),什么时候用Synchronized(this)?
[Quote=引用 8 楼 zhouyuqwert 的回复:]
Synchronized(this)锁当前对象,两个不同线程持有同一个this执行会锁掉一个 这一句?
this知道什么意思吧 当前类的对象
如果我两个线程传了同一个对象进去,那么this就是穿进去的那个对象,
A a = new A();

Thread c = new Thread(a);
Thread d = new Thread(a);

class Thread{
pr……
[/Quote]
阳明 to life 2011-08-24
  • 打赏
  • 举报
回复
Synchronized(this)锁当前对象,两个不同线程持有同一个this执行会锁掉一个 这一句?
this知道什么意思吧 当前类的对象
如果我两个线程传了同一个对象进去,那么this就是穿进去的那个对象,
A a = new A();

Thread c = new Thread(a);
Thread d = new Thread(a);

class Thread{
private A a;
public Thread(A a)
{
this.a = a;
}
run()
{
a.method();//两个线程假设同时执行到这,用相同对象调用method,看method处理
}
}

class A
{
void method()
{
sychornized(this) //两个线程因为持有相同的对象,调用了method,此处如果有一个线程获取了锁,另外一个线程必须等待在此锁上,但是如5楼那种情况则不会等待在此锁上,两个线程依然会同时执行后面块中的代码
{
}
}
}


自己照着这代码写个完整的试试,应该就能理解了
da1da2_2011 2011-08-24
  • 打赏
  • 举报
回复
这句不是很懂啊,大哥,能再详细一点不?
[Quote=引用 4 楼 zhouyuqwert 的回复:]
Synchronized(this)锁当前对象,两个不同线程持有同一个this执行会锁掉一个
Synchronized(obj)锁Obj对象,this本身就是一个Object对象,而有时候两个线程持有的this本身就不同,你又想同步,可以通过新建一个两个线程共同拥有的对象锁住
[/Quote]
licip 2011-08-24
  • 打赏
  • 举报
回复
+1[Quote=引用 4 楼 zhouyuqwert 的回复:]
Synchronized(this)锁当前对象,两个不同线程持有同一个this执行会锁掉一个
Synchronized(obj)锁Obj对象,this本身就是一个Object对象,而有时候两个线程持有的this本身就不同,你又想同步,可以通过新建一个两个线程共同拥有的对象锁住
[/Quote]
阳明 to life 2011-08-24
  • 打赏
  • 举报
回复
比如
A a = new A();
A b =new A();
Thread c = new Thread(a);
Thread d = new Thread(b);

class Thread{
private A a;
run()
{
a.method();//而在method方法中想同步某一块用this是没用的
}
}
阳明 to life 2011-08-24
  • 打赏
  • 举报
回复
Synchronized(this)锁当前对象,两个不同线程持有同一个this执行会锁掉一个
Synchronized(obj)锁Obj对象,this本身就是一个Object对象,而有时候两个线程持有的this本身就不同,你又想同步,可以通过新建一个两个线程共同拥有的对象锁住
da1da2_2011 2011-08-24
  • 打赏
  • 举报
回复
那这样写和Synchronized(this)有什么区别啊?
[Quote=引用 1 楼 xinyu5073 的回复:]
举个例子吧,其实这个object无意义

class Test
{
private Object obj = new Object();// 随便定义的,无意义

synchronized(obj)
{
.......里面的代码
}
}

不知道你能明白不
[/Quote]
luohuijun619 2011-08-24
  • 打赏
  • 举报
回复
synchronized还可以加到方法上,加在对象话, private static Object obj = new Object();
xinyu5073 2011-08-24
  • 打赏
  • 举报
回复
举个例子吧,其实这个object无意义

class Test
{
private Object obj = new Object();// 随便定义的,无意义

synchronized(obj)
{
.......里面的代码
}
}

不知道你能明白不

62,614

社区成员

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

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