java 板


LINE

※ 引述《abschihok (大帅哥)》之铭言: : 请问以下二组各有何不同? : 第一组: : class Some{ : public static synchronized void method(){ : ...... : } : } : class Some{ : public synchronized void method(){ : ...... : } : } : 以上差别在有无static字眼 : 第二组: : class Some{ : void method(){ : synchronized(Some.class){ : .... : } : } : } : class Some{ : void method( ){ : synchronized(this){ : .... : } : } : } : 请问以上两组各有何不同? : 我的看法是: : 第一组:如果有加static的话,代表可以锁住不同的Some 物件的thread, : 如果没加static的话,只能锁住本身的Some物件的thread : 第二组:其实也是和第一组的一样,如果是synchronized(Some.class){}的话, : 代表可以锁住不同Some物件的thread : 请问大家,我的答案是对的吗? 第一组和第二组一样,所以解释第一组等同於一起解释了第二组。 如果有加 static 的话,代表呼叫该方法的执行绪被同步於 Some.class 意思是如果有其他执行绪也被同步於 Some.class 只有一个执行绪能够进入 critical section,同时锁住 Some.class 其他被同步於 Some.class 的执行绪都必须等待...直到 Some.class 被解开为止。 你可以做个想像实验 (举例好麻烦,写一写发现至少要贴两页...乾脆不举例) 有两个不同的程式码如下: public class Clazz1 { public void method() { synchronized(Some.class) { sleep("1 second"); // 睡一秒的虚拟码 System.out.println("clazz1"); } } } public class Clazz2 { public void method() { synchronized(Some.class) { sleep("1 second"); // 睡一秒的虚拟码 System.out.println("clazz2"); } } } 任一执行绪呼叫 Clazz1 物件的 method 时,会睡一秒之後印出 clazz1 在睡觉的同时,如果另一执行绪呼叫 Clazz2 物件的 method,必须等待 Clazz1 那边睡饱并且印出 clazz1 之後才有机会进入 critical section:睡一秒再印出 clazz2 如果不加 static 的话,代表呼叫该方法的执行绪被同步於 this 物件 意思是如果有其他执行绪也被同步於相同的 this 物件 只有一个执行绪能够进入 critical section,并且锁住 this 物件 其他被同步於相同 this 物件的执行绪都必须等待...直到 this 物件被解开为止。 需要注意的是:并不是所有写着 "this" 的物件都是同一个 以上面的程式码而言,把所有 Some.class 都改成 this 这时候你应该会轻易看出 Clazz1 的 this 物件和 Clazz2 的 this 物件应该不会一样 下面例子: Clazz1 object1 = new Clazz1(); Clazz2 object2 = new Clazz2(); 这个例子说明 object1 和 object2 不同,所以两个 method() 方法内的 synchronized (this) {......} 看到的 this 物件当然也不同 所以 object1 物件呼叫 method() 睡一秒的同时 并『没有』办法让 object2 物件等待 object1 睡饱才进入 critical section 而是两者并行处理,无法确定谁会先印出讯息 先 clazz1 後 clazz2 或是先 clazz2 後 clazz1 就没人知道了。 原因是两者的 monitor 不同 (也就是 this 不同) 如果要让 object2 等待 object1 睡饱才进入 critical section 的话 两者 monitor 必须相同。 额外补充,synchronized (this) {......} 并非如上述那样无用,反而是经常使用的。 当有需要执行绪同时对同一物件存取时,如果没有用 synchronized (this) {......} 而是另外用到 mutex 物件: synchronized (mutex) {......} 不仅多浪费了些记忆体,还造成管理成员变数的复杂度。 -- 靠印象打的,很少在写多绪,如果有错,还请不吝指正。 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.117.172.148 ※ 编辑: H45 来自: 122.117.172.148 (09/16 01:19) ※ 编辑: H45 来自: 122.117.172.148 (09/16 01:22) ※ 编辑: H45 来自: 122.117.172.148 (09/16 01:24)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP