黑马程序员技术交流社区
标题:
多线程锁lock与sychronized
[打印本页]
作者:
佟亚鹏
时间:
2012-9-15 08:55
标题:
多线程锁lock与sychronized
本帖最后由 佟亚鹏 于 2012-9-15 12:45 编辑
lock与sychronized都是用于锁定资源,可以认为lock是cynchronized 的升级,Lock能完成synchronized的所有功能。关于这点,释放锁时后者会自动释放,前者需要在finally中手动释放,有点先不明白自动释放锁在程序中有什么意思呢?求助高手,给说说。。。
作者:
武庆东
时间:
2012-9-15 10:40
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则可以在不同范围内获取释放,并且顺序无关。
作者:
佟亚鹏
时间:
2012-9-15 10:45
武庆东 发表于 2012-9-15 10:40
synchronized:在代码里,synchronized类似“面向对象”,修饰类、方法、对象
Lock:不作为修饰,类似“面 ...
也就是说,使用Lock可以自己控制这个过程,比使用synchronized这个灵活,而且效率高,但是没有synchronized方便,可以这样认为吗
作者:
武庆东
时间:
2012-9-15 11:06
java现有的锁机制有两种是是实现方式,jkd1.4前是通过synchronized实现,JDK1.5后加入java.util.concurrent.locks包下的各种Lock。
因综合来看,对于所有的高并发情况,采用Lock加锁是最优选择,但是由于其他种种原因,synchronized也还是不能完全被淘汰,同时,在低并发的情况下synchronized是比Lock好!
作者:
田旭阳
时间:
2012-9-15 11:39
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的性能能维持常态
作者:
佟亚鹏
时间:
2012-9-15 12:45
谢谢各位回答,大致明白
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2