Chinaunix

标题: 关于java线程的疑惑 [打印本页]

作者: apollolegend    时间: 2006-04-06 08:30
标题: 关于java线程的疑惑
操作系统中把线程同步和线程互斥的概念给的很清楚
同步:相关线程相互等待和相互唤醒
互斥:多个线程访问同一资源时,必须采取的一种回避机制
而在java中 synchronized明明就是定义一个用于实现互斥的临界区,却把他叫做synchronized(同步),是不是在java线程模型中根本就没有互斥的概念呢?
作者: carset    时间: 2006-04-06 09:13
Java里是共产主义

按需分配(需 包括你手工指定 那个线程 需)
作者: xxjoyjn    时间: 2006-04-06 09:26
楼上的兄弟好油墨呀
作者: apollolegend    时间: 2006-04-06 09:28
原帖由 carset 于 2006-4-6 09:13 发表
Java里是共产主义

按需分配(需 包括你手工指定 那个线程 需)

可否详细解释一下?
作者: carset    时间: 2006-04-06 10:23
。。。这个没什么好解释的吧。

一个茅房。俺进去了就把门锁上。你自然就进不来。等俺出来了。把门打开了。你就可以了了 :em06
作者: wobushiwo    时间: 2006-04-06 11:35
同步:相关线程相互等待和相互唤醒
互斥:多个线程访问同一资源时,必须采取的一种回避机制


有矛盾吗? 线程之间相互等待和相互唤醒,只有声明了 synchronized 才能这样做

关于互斥,你说 多个线程访问同一资源时,必须采取的一种回避机制,什么机制啊? 是等待还是drop掉啊?
作者: perryhg    时间: 2006-04-06 14:06
jdk 5 提供了更细粒度的线程和并发运行控制,见java.util.concurrent包及相关的文档
作者: cooljia    时间: 2006-04-06 16:53
原帖由 carset 于 2006-4-6 10:23 发表
。。。这个没什么好解释的吧。

一个茅房。俺进去了就把门锁上。你自然就进不来。等俺出来了。把门打开了。你就可以了了 :em06




原帖由 perryhg 于 2006-4-6 14:06 发表
jdk 5 提供了更细粒度的线程和并发运行控制,见java.util.concurrent包及相关的文档


还没接触过jdk1.5, 一直奋斗在1.42的前沿阵地.
作者: xxjoyjn    时间: 2006-04-06 17:00
原帖由 carset 于 2006-4-6 10:23 发表
。。。这个没什么好解释的吧。

一个茅房。俺进去了就把门锁上。你自然就进不来。等俺出来了。把门打开了。你就可以了了 :em06


作者: kakasi    时间: 2006-04-06 18:15
说的是一个事,同步是为了互斥访问,总之就是茅房关门问题:em11:
作者: apollolegend    时间: 2006-04-07 11:27
楼上的兄弟们我想说的是:同步和互斥不是一回事,
1)同步解决的是一组进程协作完成一个任务的问题,比如多个线程写缓冲区多个线程读缓冲区,写进程之间、读写进程之间需要互斥。但是读进程的等待是由两个因素造成的,一个是写线程正在写,这是互斥的问题,而如果缓冲区没有数据可以读,这就是同步的问题。
2)互斥解决的是,资源独占访问的问题。
如果这个还没搞清楚,最好你在看看操作系统的线程管理部分的内容
作者: wobushiwo    时间: 2006-04-07 11:55
synchronized 实现互斥继而实现同步

我认为只有在互斥的基础上才能实现同步

你的疑问是它的起名为什么只叫 同步 吗?
作者: wobushiwo    时间: 2006-04-07 11:59
synchronized 它确实有互斥的作用,继而使用 唤醒等,实现了同步,保证了执行顺序

你的疑问是它为啥起这名吗?
作者: tinywind    时间: 2006-04-07 12:08
lz所说的同步有点象pthread中的条件变量,可以看wait(),notify(),notifyAll()等方法
作者: kakasi    时间: 2006-04-07 13:28
os确实学的不好,平时遇到最多的也是“互斥”问题,不过我也不准备研究了,工作了不比作学问的时候啦,多谢lz提醒

PS:其实我是觉得这个茅房关门问题更值得关注,所以才水了一帖,嘿嘿
作者: apollolegend    时间: 2006-04-07 13:43
原帖由 wobushiwo 于 2006-4-7 11:55 发表
synchronized 实现互斥继而实现同步

我认为只有在互斥的基础上才能实现同步

你的疑问是它的起名为什么只叫 同步 吗?

互斥只是实现了排队的功能,当一个有锁的线程离开关键区的时侯,后续的线程可以进入临界区,但是这里根本不涉及到因为其他原因(如资源不可用,没有数据可读等)带来的对等待线程的调度的所谓的同步问题。我的疑问:既然只是实现了简单的互斥功能,为什麽起了一个这么大的一个名字:同步(synchronized)。叫个关键区(criticalsection)什么的是不是更贴切.
作者: apollolegend    时间: 2006-04-07 14:46
原帖由 kakasi 于 2006-4-6 18:15 发表
说的是一个事,同步是为了互斥访问,总之就是茅房关门问题:em11:

kakasi先生,如果你进了茅房,带上茅房的门,当你蹲完了之后突然发现每天那里都很充足的手纸今天却突然到你这里被用光了,这时候你和送手纸的人之间难道还是互斥问题么,你是不是得打电话(唤醒)找换手纸的人啊。
如果你一直占有茅房,送手纸的也进不来,别人也进不来上厕所,这就是典型的死锁。
作者: wobushiwo    时间: 2006-04-07 14:49
原帖由 apollolegend 于 2006-4-7 13:43 发表

互斥只是实现了排队的功能,当一个有锁的线程离开关键区的时侯,后续的线程可以进入临界区,但是这里根本不涉及到因为其他原因(如资源不可用,没有数据可读等)带来的对等待线程的调度的所谓的同步问题。我的疑 ...



说了,只有 互斥 的前提下,配合了唤醒功能,才能实现同步

你放心吧,先有纸才让你进去拉...........
作者: carset    时间: 2006-04-07 14:55
呵呵。可以明显看出来。谁是工作的。谁是上学的。

工作的目的只有一个,解决问题。拿到工资。

上学的不但想知道得到什么结果,还想知道为什么会得到这个结果。

其实在计算机里。好多东西不存在为什么,他就是这么规定的。你想玩。就必须遵守他的规则。
作者: wobushiwo    时间: 2006-04-07 14:59
我的疑问:既然只是实现了简单的互斥功能,为什麽起了一个这么大的一个名字:同步(synchronized)。叫个关键区(criticalsection)什么的是不是更贴切.

互斥 + 唤醒/等待 , 实现同步


至于为什么硬要起 synchronized ,我是没什么发言权了。。。
作者: 艾斯尼勒    时间: 2006-04-07 15:04
原帖由 apollolegend 于 2006-4-7 13:43 发表

互斥只是实现了排队的功能,当一个有锁的线程离开关键区的时侯,后续的线程可以进入临界区,但是这里根本不涉及到因为其他原因(如资源不可用,没有数据可读等)带来的对等待线程的调度的所谓的同步问题。我的疑 ...



这个你可能要咨询james了。。。。。
作者: kakasi    时间: 2006-04-07 15:40
汗,这么生动的例子都举得出来!

lz,放过我吧~我已经感谢你提醒,承认我没有理解好同步和互斥,因为暂时我的工作世界里还只是碰到互斥问题,概念是用来干什么的,名称呢?比起概念来说恐怕更微不足道了
作者: carset    时间: 2006-04-07 15:43
呵呵~~ 邓小平说过。管他黑猫白猫,能抓老鼠就是好猫。

(似乎我们是只知其然。不知其所以然)看来要去看看sun的文档,看看到底为什么会叫 Java ,而不叫 avaj


作者: 白色乌鸦    时间: 2006-04-07 17:37
原帖由 apollolegend 于 2006-4-7 13:43 发表

互斥只是实现了排队的功能,当一个有锁的线程离开关键区的时侯,后续的线程可以进入临界区,但是这里根本不涉及到因为其他原因(如资源不可用,没有数据可读等)带来的对等待线程的调度的所谓的同步问题。我的疑 ...


我倒是挺喜欢“同步”这个词的
作者: cooljia    时间: 2006-04-07 18:23
18, 19楼说的不错
作者: apollolegend    时间: 2006-04-07 19:31
1)开发小组原来看到的是oak,但因为注册的时候已经被别人注册,所以很郁闷,回来喝咖啡的时候才想起来java这个词,因为咖啡产在java岛,而不是avaj岛,所以叫java,不叫avaj
2)我的成长路径是学习->工作->又去学习->又工作.

[ 本帖最后由 apollolegend 于 2006-4-7 19:35 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2