黑马程序员技术交流社区

标题: JAVA多线程中“锁”的概念的理解 ?? [打印本页]

作者: 荣天    时间: 2012-5-10 17:21
标题: JAVA多线程中“锁”的概念的理解 ??
JAVA多线程中“锁”的概念的理解??  哪位大虾 帮忙解释下
作者: 李啸    时间: 2012-5-10 17:23
说的通俗一点 就是有一个卫生间一次只能有一个解决 如果里面有人在 那么外面的人必须等里面的人出来再进去 也叫同步
作者: 黄坚声    时间: 2012-5-10 17:32
你从对象自身出发去想  反正一个对象就只有一把锁 只要有线程来访问它 就会上锁 其他的所有线程在此期间都不能访问上锁的对象或方法  就像一间房子,你进去后上了锁 不管是你自家的人 还是其他人都进不去 只有你自己在屋里
作者: 黄坚声    时间: 2012-5-10 17:33
你从对象自身出发去想  反正一个对象就只有一把锁 只要有线程来访问它 就会上锁 其他的所有线程在此期间都不能访问上锁的对象或方法  就像一间房子,你进去后上了锁 不管是你自家的人 还是其他人都进不去 只有你自己在屋里
作者: 小小企鹅    时间: 2012-5-10 17:35
本帖最后由 小小企鹅 于 2012-10-27 22:37 编辑

每个Java对象都有一个锁,每个锁只有一把钥匙。通常对象都没上锁,但如果对象有同步化方法的话,则线程只能在取得钥匙的情况下进入线程。也就是说并没有其他线程已进入的情况下才能进入。
只要把作用在数据上的方法同步化,在方法的声明上加synchronized这个修饰符:
private synchronized void fun(){};
就可以防止两个线程同时进入同一方法。  

作者: 杨威    时间: 2012-5-10 17:48
我讲个大概啊
举个不是太恰当的小例子,在乡下有一个公共厕所,有两个坑(中间无隔墙),是可以同时两个人(同性)用的,但是呢这个厕所没标明那男女,所以呢当有一个人进入时,他就把门给锁上,里面的公共手纸啊都是他一个人用,对不对?但是现在问题来了,有这么一号人,他没上锁,另一个人也进来了(姑且考虑这两个人同性啊),后进来这人解决的快点,他把本属于先进来的手纸给用完了,那第一个人就没得用了,就一直在那蹲下去了,你说痛不痛苦?
上面例子中厕所门就好比程序入口,公共手纸就好比资源,不是太恰当,希望你能理解。{:soso_e100:}
作者: Gao23616    时间: 2012-5-10 17:59
黄坚声 发表于 2012-5-10 17:32
你从对象自身出发去想  反正一个对象就只有一把锁 只要有线程来访问它 就会上锁 其他的所有线程在此期间都 ...

使程序更安全,不会出现
同步的前提:
同步需要两个或者两个以上的线程。
多个线程使用的是同一个锁。
未满足这两个条件,不能称其为同步。
同步的好处:
       同步的出现解决了多线程的安全问题。
同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。

作者: HeiMaYSL    时间: 2012-5-10 18:28
锁一般用在多线程中,
作用是:把同步的共享数据放在里面,这样,这些数据在想干什么就干什么,与锁外面的无关,
但是,锁外面的线程都在急着进去,因为,里面有其他线程,所以,进不去。
只有当里面线程出来时,这时,等于释放了这个锁,而其他的线程就可以进去一个了。同理,它在里面时,也是想干什么都行,锁外面都进不去,只能等它出来后,释放了锁。其它线程才能进去。

毕老师在讲到这里时,举了个经典的例子:就是在火车上的厕所。你去看看,就会明白了。

其实,锁就像一个厕所一样。里面只能有一个人在里面办事,等这个出来了,把厕所门打开了,就是释放了厕所。这时,其他人才能进去一个。明白了吧。
作者: HeiMaYSL    时间: 2012-5-10 18:29
锁一般用在多线程中,
作用是:把同步的共享数据放在里面,这样,这些数据在想干什么就干什么,与锁外面的无关,
但是,锁外面的线程都在急着进去,因为,里面有其他线程,所以,进不去。
只有当里面线程出来时,这时,等于释放了这个锁,而其他的线程就可以进去一个了。同理,它在里面时,也是想干什么都行,锁外面都进不去,只能等它出来后,释放了锁。其它线程才能进去。

毕老师在讲到这里时,举了个经典的例子:就是在火车上的厕所。你去看看,就会明白了。

其实,锁就像一个厕所一样。里面只能有一个人在里面办事,等这个出来了,把厕所门打开了,就是释放了厕所。这时,其他人才能进去一个。明白了吧。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2