黑马程序员技术交流社区
标题:
snychronized和lock的区别?
[打印本页]
作者:
陈作亮
时间:
2012-3-17 13:47
标题:
snychronized和lock的区别?
为什么要将同步的synchronized换成现实lock,现实lock的好处都是什么?
作者:
魏群
时间:
2012-3-17 14:18
代码层:用lock可以显示的加锁和解锁。
性能:在并发高的时候lock有优势,相反synchronized有优势。
所有对象都自动还有单一的锁。JVM负责跟踪对象被加锁的次数。如果以个对象被解锁,其计数器变为0,在线程第一次给对象加锁的时候计数器变为1.每当这个相同线程在此对象上获得锁时计数器会递增。只有首先获得锁的线程才能继续获得该对象上的多个锁。每当任务离开时计数器递减减。当计数器为0的时候锁被完全释放。synchronized作用于方法时锁住的事this作用于静态方法时锁住的是Class,作用于一般对象时锁住的是代码块 这就是对象监视器。
lock原理不同synchornized面向对象 它基于栈中的框架而不是某个具体对象,所以lock只需要在栈里设置锁的开始和结束的地方就行了不用关心框架大小对象的变化。这么做的好处是lock提供无条件的,可轮询的,定时的可中断的锁获取操作。相对于synchronized来说 synchronized的锁的获取是释放必须在一个模块里,获取和释放的顺序必须相反而lock则可以再不同范围内获取释放,并且顺序无关。
综合看来高并发的时候还是用lock 历史遗留问题所以synchronized还未淘汰。
作者:
黑马肖凯骏
时间:
2012-3-17 14:31
synchronized 修饰方法时 表示同一个对象在不同的线程中 表现为同步队列
如果实例化不同的对象 那么synchronized就不会出现同步效果了
1.对象的锁
所有对象都自动含有单一的锁。
JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,计数变为1。每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。
只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。
每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。
2.synchronized同步块
2.1同步到单一对象锁
当使用同步块时,如果方法下的同步块都同步到一个对象上的锁,则所有的任务(线程)只能互斥的进入这些同步块。
Resource1.java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中,虽然这些同步块处在不同的方法中,但由于是同步到同一个对象(当前对象 synchronized (this)),所以对它们的方法依然是互斥的。
ps:
主要相同点:lock能完成synchronized所实现的所有功能
主要不同点:lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放.
作者:
崔宝东
时间:
2013-3-26 12:22
6、jdk1.5中提供了多线程升级解决方案,
将同步Synchronized替换成显示的Lock操作。
将Object中的wait ,notify ,notifyAll,替换成了Condition对象。
该对象可用Lock锁进行获取。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2