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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈作亮 注册黑马   /  2012-3-17 13:47  /  3785 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么要将同步的synchronized换成现实lock,现实lock的好处都是什么?

3 个回复

倒序浏览
代码层:用lock可以显示的加锁和解锁。
性能:在并发高的时候lock有优势,相反synchronized有优势。
所有对象都自动还有单一的锁。JVM负责跟踪对象被加锁的次数。如果以个对象被解锁,其计数器变为0,在线程第一次给对象加锁的时候计数器变为1.每当这个相同线程在此对象上获得锁时计数器会递增。只有首先获得锁的线程才能继续获得该对象上的多个锁。每当任务离开时计数器递减减。当计数器为0的时候锁被完全释放。synchronized作用于方法时锁住的事this作用于静态方法时锁住的是Class,作用于一般对象时锁住的是代码块 这就是对象监视器。
lock原理不同synchornized面向对象 它基于栈中的框架而不是某个具体对象,所以lock只需要在栈里设置锁的开始和结束的地方就行了不用关心框架大小对象的变化。这么做的好处是lock提供无条件的,可轮询的,定时的可中断的锁获取操作。相对于synchronized来说 synchronized的锁的获取是释放必须在一个模块里,获取和释放的顺序必须相反而lock则可以再不同范围内获取释放,并且顺序无关。
综合看来高并发的时候还是用lock  历史遗留问题所以synchronized还未淘汰。
回复 使用道具 举报
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从句中释放.
回复 使用道具 举报
6、jdk1.5中提供了多线程升级解决方案,

    将同步Synchronized替换成显示的Lock操作。

   将Object中的wait ,notify ,notifyAll,替换成了Condition对象。

   该对象可用Lock锁进行获取。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马