黑马程序员技术交流社区

标题: 关于多线程锁的问题(Lock) [打印本页]

作者: 亦金亦水    时间: 2014-6-10 19:15
标题: 关于多线程锁的问题(Lock)
视频中看到关于多线程这块,创建锁的部分。

为什么要这样创建?
Lock lock = new ReentrantLock();
为什么不创建 Lock lock = new Lock()?

另外,为什么要创建
Condition notFull  = lock.newCondition();

作者: 谢振宣    时间: 2014-6-10 19:52
Lock lock = new ReentrantLock();

1,Lock是一个接口,只能通过它的具体实现,来创建锁对象。

Condition notFull  = lock.newCondition();

2,有了锁之后,还要有钥匙,才能实现开锁和上锁的功能,Condition就相当于这把锁的钥匙。

3,Lock替代的是synchronized,是一种显式的调用方式,需要在finally中显式的释放。

4,Condition中的await和signal、signalAll方法,替代了Object中的wait和notify、notifyAll方法。
Object的特点是,一把锁只有一把钥匙;Condition的特点是,一把锁可以有多把钥匙。
虽然condition可以有多个钥匙,但是开锁和上锁的钥匙,必须是同一把。
作者: 亦金亦水    时间: 2014-6-11 10:47
谢振宣 发表于 2014-6-10 19:52
Lock lock = new ReentrantLock();

1,Lock是一个接口,只能通过它的具体实现,来创建锁对象。

请问 ReentrantLock类实现了Lock接口类,为什么不这样创建对象:
ReentrantLock ro = new ReentrantLock()
作者: 周小宁    时间: 2014-6-11 16:51
Loke是接口啊。只能通过实现类来创建对象。
Lock lock = new ReentrantLock(); //这条语句使用了多态  楼主应该明白吧
而这个ReentrantLock类则是Loke接口的常用实现类

JDK1.5 中提供了多线程升级解决方案。
将同步Synchronized替换成现实Lock操作。
将Object中的wait,notify notifyAll,替换了Condition对象。
该对象可以Lock锁 进行获取。
该示例中,实现了本方只唤醒对方操作。


而关于这个语句

Condition notFull  = lock.newCondition();

Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,使用其 newCondition() 方法。

Condition类主要作用是替代同步代码块中wait notify notifyAll等方法


这样说能明白么。
作者: 亦金亦水    时间: 2014-6-13 16:38
周小宁 发表于 2014-6-11 16:51
Loke是接口啊。只能通过实现类来创建对象。
Lock lock = new ReentrantLock(); //这条语句使用了多态  楼主 ...

谢谢!!!!




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