作者etman395 (技术时代)
看板java
标题[J2SE] 执行绪synchronized心得
时间Fri Oct 2 19:12:15 2009
今天学弟来跟我讨论执行绪
说他不是很明白
我就讲了一段我之前理解的小故事给他听
故事是针对三种synchronized 情形
刚好分享一下心得
如果有错或可以补充
还请纠正补强一下
no synchronized
synchronized
static synchronized
执行绪a 操作 实体a
执行绪b 操作 实体a
执行绪a b就像双胞胎兄弟一样
实体a就像哥哥的黏土一样
synchronized 就像铁盒一样
如果哥哥明天要交作业 而作业放在铁盒里
那该如何确保明天要交作业之前
黏土不会先被弟弟恶作剧破坏
no synchronized(没上锁的铁盒) method(没上锁 要打开就可以打开)()
{
//操作黏土
//交作业
}
synchronized(有上锁的铁盒) method(有上锁 有钥匙的人才可以打开)()
{
//操作黏土
//交作业
}
从上面可以看到
哥哥只要将铁盒上锁 就可以安心的把做完黏土和交作业的事情都处理完
如果哥哥中间做到一半休息 铁盒就会锁着
弟弟突然偷溜进来想搞破坏 铁盒还是打不开的 因为弟弟没有钥匙
接着他又问我
执行绪a 操作 实体a
执行绪b 操作 实体b
是什麽意思??
我只跟他讲
意思就像弟弟也忙着赶他的黏土
他们各自有各自的黏土要弄
就不会互相破坏
所以不上锁也没差
如同
no synchronized(没上锁的铁盒) method(没上锁 要打开就可以打开)()
{
//操作黏土
//交作业
}
method(甚至连铁盒都没有)()
{
//操作黏土
//交作业
}
最後他问我
但他有看到书上有这样
static synchronized void main()
但明明就是操作不同实体啊
为何还要上锁??
我就告诉他
因为明天他们黏土都做完了
要交作业了
老师希望他们照号码将黏土一个一个排好
之後老师再上前去打分数
这时如果有人插队进来
黏土的位置就会不对
就会打错分数
而static synchronized就是为了防止这点
让所以人可以一个一个排队
意思就是说 两个执行绪都持相同类别,所以都要排队
都要排队
(当然还有一个作用 是不用new就可以操作该方法)
最後他问我sleep和wait的差别
我就直接讲了没有举例
sleep不会放锁 wait会放锁 并且wait一放锁就必须要透过notify
才能重新获得执行的机会
或者运用interrupt的方法
interrupt可以直接运用在wait sleep join
运用interrupt在某执行绪身上
只要该执行绪是处於wait sleep join的情形下
就会跑出InterruptedException
如果该执行绪不是在wait sleep join的情形下
就完全没有影响
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.110.83.12
※ 编辑: etman395 来自: 123.110.83.12 (10/02 19:14)
1F:→ etman395:标题下错 是J2SE.... 10/02 19:15
2F:→ james732:按大T可以修改标题 10/02 19:24
3F:→ etman395:谢谢 10/02 19:34
4F:→ sbrhsieh:我觉得告诉他 synchronized 的语意与背後机制比较实在。 10/02 20:11
5F:→ darkk6:mathod ? method ? 10/02 23:37
※ 编辑: etman395 来自: 123.110.83.12 (10/02 23:52)
6F:推 KanoLoa:我觉比喻用过头 让我完全混乱了....QQ 10/03 09:59
※ 编辑: etman395 来自: 123.110.83.12 (10/03 21:51)