A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tuanjie 中级黑马   /  2014-1-14 11:17  /  1396 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在使用多线程时,一般会使用synchronized关键字对代码和方法进行同步,从jdk5以后出现了Lock类,功能和synchronized关键字是一样的,只是实现的方式不一样。使用synchronized可以同步方法和同步代码块:
synchronized同步代码块:
synchronized(同步监听对象) {
//需要同步的代码
}
同步监听对象取值通常有:
1. 同一份资源;
2. this,此时只能使用实现方式,继承时不能使用this
3. 同步代码块所在类的字节码,
synchronized同步方法时:
非静态方法默认使用的是this作为同步监听对象;
静态方法默认是使用的是方法所在类的字节码对象;
使用Lock类时:使用lock()对代码和方法进行加锁

问题是:设计到很多个线程,比如消费者和生产者问题,会出现死锁的可能,为了避免死锁,使用synchronized关键字对代码块和方法进行同步时,最后都使用 notify();  //唤醒等待中的第一个线程 ,notifyAll();//唤醒剩下的所有线程 这两个方法唤醒线程,这两个方法时从Object类继承的
但是使用Lock类时,却不可以使用 notify(); notifyAll();这两个方法唤醒线程,要想唤醒线程,必须使用Condition中的signal() 唤醒等待中的第一个线程,signalAll()方法 唤醒所有等待线程。
Lock类的父类不也是Object类吗,也继承了notify(),notifyAll()方法,为什么不可以使用这两个方法呢?而只能使用Condition中的signal(),signalAll()
方法唤醒等待中的线程。
      

评分

参与人数 1黑马币 +2 收起 理由
黄晓鑫 + 2

查看全部评分

4 个回复

倒序浏览
一样是可以的 只是JDK升级了一下 避免了死锁的出现
回复 使用道具 举报
黄晓鑫 发表于 2014-1-14 23:05
一样是可以的 只是JDK升级了一下 避免了死锁的出现

由于在家不能上网,回复晚了,抱歉!
Lock类和synchronized关键字时不一样的,在多线程中如果使用了wait方法,就需要唤醒线程。使用synchronized关键字修饰的线程存在同步监听对象,可以使用同步监听对象调用Object类里面的notify和notfyAll方法唤醒线程,但是,如果使用Lock类,就不存在同步监听对象了,就不能使用Object类里面的notify和notfyAll方法唤醒线程,只有使用Condition类中的signal和signalAll方法唤醒线程,这是我看传智播客里面的视频知道的。以后在使用多线程的时候,是使用synchronized关键字还是使用Lock类呢,那个会好些?
回复 使用道具 举报
同步代码块和函数 可以用synchronized 如果是用到了不是多线程的类 而自己想加锁用Lock
回复 使用道具 举报
synchronized块是内置锁,Lock是JDK5.0以后的显示锁。每个condition类可以专门绑定一类线程,对于condition的signal signalAll 相对于 notify 和 notifyall 应该是性能有所提升,也许是为了避免混淆吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马