原文:http://blog.csdn.net/zheng548/article/details/54426947

区别一:API层面

syschronized使用

synchronized即可修饰方法,也可以修饰代码块。

synchronized修饰方法时,如下所示:

//synchronized修饰一个方法时,这个方法叫同步方法
public synchronized void test(){
//方法体
}

synchronized修饰代码块时,包涵两部分:锁对象的引用和这个锁保护的代码块。如下所示:

synchronized (0bject){
//括号中表示需要锁的对象
//线程执行时会对object上锁
}

ReentrantLock使用

public class test(){
private Lock lock=new ReentrantLock();
public void testMethod(){
try{
lock.lock();
//code
}
finally{
lock.unlock();
}
}
}

区别二:等待可中断

引用周志明的《深入理解Java虚拟机》Page 392

等待可中断是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。可等待特性对处理执行时间非常长的同步块很有帮助。

具体说来,假如业务代码中有两个线程,Thread1 Thread2.假设Thread1获取了对象object的锁,Thread2将等待Thread1释放object的锁。

  • 使用synchronized。如果Thread1不释放,Thread2将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁(mutual exclusion lock ,mutex)的角色,一个线程引用锁的时候,别的线程阻塞等待。

  • 使用ReentrantLock。如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。

区别三:公平锁

引用周志明的《深入理解Java虚拟机》Page 392

公平锁是指多个线程在等待同一个锁时,必须按照申请的时间顺序来依次获得锁;而非公平锁则不能保证这一点。非公平锁在锁被释放时,任何一个等待锁的线程都有机会获得锁。 synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁,但可以通过带布尔值的构造函数要求使用公平锁。

区别四:绑定多个条件

ReentrantLock可以同时绑定多个Condition对象,只需多次调用newCondition方法即可。

synchronized中,锁对象的wait和notify() 或notifyAll()方法可以实现一个隐含的条件。但如果要和杜宇一个的条件关联的时候就不得不额外添加一个锁。

区别五:性能

JDK 1.5中,synchronized还有很大的优化余地。JDK 1.6 中加入了很多针对锁的优化措施,synchronized与ReentrantLock性能方面基本持平。虚拟机在未来的改进中更偏向于原生的synchronized。

补充:

①Java中每个对象都有一个锁(lock)或者叫做监视器(monitor).

②ReentrantLock和synchronized持有的对象监视器不同。

③如果synchronized方法是static的,那么当线程方法改方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在对象所对应的class对象,因为java中不管一个类有多少对象,这些对象会应对唯一一个Class对象。因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,是顺序执行的,即一个线程先执行,另一个才开始。

④synchronized方法是一种粗粒度的并发控制,某一时刻只能有一个线程执行synchronized方法,synchronized快则是一种细粒度的并发控制。只会将 块中代码同步,位于方法内,synchronized块之外的是可以被多个线程同时访问的。

⑤synchronized关键字经过编译之后,会在同步块的前后分别形成monitorenter和monitorexit两个字节码指令,操作对象均为锁的计数器。

⑥相同点:都是可重入的。可重入值的是同一个线程多次试图获取它所占的锁,请求会成功。当释放的时候,直到冲入次数清零,锁才释放。

java synchronized和(ReentrantLock)区别的更多相关文章

  1. Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)

    这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的 ...

  2. synchronized和ReentrantLock区别

    一.什么是sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默 ...

  3. Synchronized与ReentrantLock区别总结

    这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式 ...

  4. synchronized 和 ReentrantLock 区别

    synchronized 使用: 1:当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁.结果,其它线程对该object对象所有同步代 ...

  5. synchronized、ReentrantLock、volatile

    名词解释 synchronized 是Java中的关键字,是一种同步锁,可以修饰代码块,方法,静态的方法,类.synchronized(Object) 不能用String常量.Integer. Lon ...

  6. java的两种同步方式, Synchronized与ReentrantLock的区别

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  7. java多线程之:Java中的ReentrantLock和synchronized两种锁定机制的对比 (转载)

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  8. Java中的ReentrantLock和synchronized两种锁机制的对比

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  9. Java中的ReentrantLock和synchronized两种锁定

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

随机推荐

  1. AndroidManifest.xml文件详解(activity)(五)

    android:taskAffinity 这个属性用于跟Activity有亲缘关系的任务.带有相同亲缘关系的Activity,在概念上是属于相同任务的(从用户的角度看,它们是属于同一应用程序的).任务 ...

  2. linux mysql 新增用户 分配权限

    insert into mysql.user(Host,User,Password) values("%","admin",password("adm ...

  3. 【Git和GitHub】学习笔记

    1. 书籍推荐: 先看一本比较简单并且好的入门书籍 Git - Book https://git-scm.com/book/zh/v2 2. 书籍理解: Git 有三种状态,你的文件可能处于其中之一: ...

  4. Android自定义上拉控件SpringView

    Demo 先看一下SpringView的效果图: 1.拖动灰色部分可拖动下方视图,点击jump按钮可让下方视图自行滑动. 使用方法 布局文件: <com.zql.android.springvi ...

  5. Linux下RTL8723BE无线网卡驱动问题解决方法

    的RT723BE这款无线网卡模块真是坑爹,岂止是坑爹,简直就是坑爹...... lspci -vnn 看网卡型号 一.安装问题: sudo apt-get install linux-headers- ...

  6. Python之实现简单计算器功能

    一,需求分析 要求计算一串包含数字+-*/()的类似于3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)表达式的数值 二,知识点 正 ...

  7. 如何修改Myeclipse的JSP模板

    先找到MyEclipse的安装目录, 再找到myeclipse/eclipse/plugins/com.genuitec.eclipse.wizards_5.1.0/templates/jsp (co ...

  8. 目标检测系列 --- RCNN: Rich feature hierarchies for accurate object detection and semantic segmentation Tech report

    目标检测系列 --- RCNN: Rich feature hierarchies for accurate object detection and semantic segmentation Te ...

  9. 2 CDuiString的bug

    重温了一下 Effective C++,发现这就是条款24所指出的问题,看来读书百遍不如写代码一遍啊 在Notify处理消息时会有很多if语句,我通常喜欢把常量放在双等号前面,变量放在后面,比如:   ...

  10. 我有一台 PC,上面有摄像头,怎么进行一场直播?

    如何推流与播放_Web端直播实践_最佳实践_视频直播-阿里云 https://help.aliyun.com/document_detail/57251.html?spm=a2c4g.11186623 ...