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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 佟亚鹏 中级黑马   /  2012-9-15 08:55  /  2292 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 佟亚鹏 于 2012-9-15 12:45 编辑

lock与sychronized都是用于锁定资源,可以认为lock是cynchronized 的升级,Lock能完成synchronized的所有功能。关于这点,释放锁时后者会自动释放,前者需要在finally中手动释放,有点先不明白自动释放锁在程序中有什么意思呢?求助高手,给说说。。。

5 个回复

倒序浏览

synchronized:在代码里,synchronized类似“面向对象”,修饰类、方法、对象
Lock:不作为修饰,类似“面向过程”,在方法中需要锁的时候lock,在结束的时候,unlock(一般在finally块里)
   代码:
   public void metho(){
   synchronized(this){//旧锁,无须人工释放
    System.out.println(1);   
  }
  }


public void method2(){
  Lock lock=new ReentrantLock();
  lock.lock();//上锁
  try{
  System.out.println(2);
    }finally{
  lock.unlock();//解锁
}
synchronzied--对象加锁
       所有对象都自动含有单一的锁,jvm负责跟踪对象被加锁的次数。如果一个对象被锁,其记数变为0。在任务(线程)第一次给对象加锁的时候,记数变为1。每当这个相同的任务(线程)在此对象上获得锁时,记数会递增。只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。每当任务离开时,记数递减,当记数为0的时候,锁被完全释放。sychronized就是基于这个原理,同时synchronized考某个独享的单一锁技术的次数来判断是是否被锁,所以无需(也不能)人工干预锁的获取和释放。

}
Lock---基于栈中的框架,而不是对象级别
       lock不同于synchronized,它基于栈中的框架而不是某个具体对象,所以Lock只需在栈里设置锁的开始和结束(lock和unlock)的地方,就行了(人工必须注明),不需要关心框架大小对象的变化等等。这么做的好处是Lock能提供无条件的、可轮询的、定时、可中断的锁获取操作,相对于synchronized来说,synchronized的锁的获取和释放不在一个模块里,获取和释放的顺序必须相反,而Lock则可以在不同范围内获取释放,并且顺序无关。

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

回复 使用道具 举报
武庆东 发表于 2012-9-15 10:40
synchronized:在代码里,synchronized类似“面向对象”,修饰类、方法、对象
Lock:不作为修饰,类似“面 ...

也就是说,使用Lock可以自己控制这个过程,比使用synchronized这个灵活,而且效率高,但是没有synchronized方便,可以这样认为吗
回复 使用道具 举报
java现有的锁机制有两种是是实现方式,jkd1.4前是通过synchronized实现,JDK1.5后加入java.util.concurrent.locks包下的各种Lock。
因综合来看,对于所有的高并发情况,采用Lock加锁是最优选择,但是由于其他种种原因,synchronized也还是不能完全被淘汰,同时,在低并发的情况下synchronized是比Lock好!
回复 使用道具 举报
Lock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候

     线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,

     如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断

     如果 使用Lock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
在资源竞争不是很激烈的情况下,Synchronized的性能要优于Lock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是Lock的性能能维持常态

回复 使用道具 举报
谢谢各位回答,大致明白
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马