synchronize、Lock、ReenTrantLock 的区别

synchronize 和Lock:

1、synchronize 系java 内置关键字;而Lock 是一个类  

2、synchronize 可以作用于变量、方法、代码块;而Lock 是显式地指定开始和结束位置

3、synchronize 不需要手动解锁,当线程抛出异常的时候,会自动释放锁;而Lock则需要手动释放,所以lock.unlock()需要放在finally 中去执行

4、性能方面,如果竞争不激烈的时候,synchronize 和Lock 的性能差不多,如果竞争激烈的时候,Lock 的效率会比synchronize 高

5、Lock 可以知道是否已经获得锁,synchronize 不能知道。Lock 扩展了一些其他功能如让等待的锁中断、知道是否获得锁等功能;Lock 可以提高效率。

6、synchronize 是悲观锁的实现,而Lock 则是乐观锁的实现,采用的CAS 的尝试机制

-------------------------------------------------------------------------------------------------

synchronize 和 ReenTrantLock:

除开上面和Lock 的区别,还有一下的一些区别:

1、ReenTrantLock 可以中断锁的等待,提供了一些高级功能

2、多个线程在等待的时候,可以提供公平的锁;默认的是非公平锁,性能会比公平锁好一些;

3、ReenTrantLock 可以绑定多个锁条件

原文地址:https://www.cnblogs.com/drafire/p/10660758.html

时间: 2024-10-10 01:44:51

synchronize、Lock、ReenTrantLock 的区别的相关文章

lock与synchronized区别详解

1.线程与进程: 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程. 线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位. 2.Thread的几个重要方法: 我们先了解一下Thread的几个重要方法. a.start()方法,开始执行该线程:b.stop()方法,强制结束该线程执行:c.join方法,等待该线程结束.d.sleep()方法,线程进入等待.e.run()方法,直接执行线程的run()方法,但是线程调用start()方法

C#中Monitor对象与Lock关键字的区别分析

这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下 Monitor对象 1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()).2.Monitor的常用属性和方法: Enter(Object)

synchronized和ReentrantLock的区别

synchronized和ReentrantLock的区别 synchronized是和if.else.for.while一样的关键字,ReentrantLock是类,这是二者的本质区别. 既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承.可以有方法.可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上: (1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁 (2)Re

EnterWriteLock与lock有啥区别?

来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=382GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com 1.这个方法中,既有读又有写,使用EnterWriteLock是否合理?与lock有啥区别?问了一下shanyl,他说是合理的. 来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=382GPS平台.网站建设.软件开发.系统运维,找森大

Synchronized与ReentrantLock的区别

Java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相同点和区别 相同点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善). 区别:这两种方式最大区别就是对于

java synchronized和(ReentrantLock)区别

原文:http://blog.csdn.net/zheng548/article/details/54426947 区别一:API层面 syschronized使用 synchronized即可修饰方法,也可以修饰代码块. synchronized修饰方法时,如下所示: //synchronized修饰一个方法时,这个方法叫同步方法 public synchronized void test(){ //方法体 } synchronized修饰代码块时,包涵两部分:锁对象的引用和这个锁保护的代码块

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

java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善). 区别: 这两种方式最大区别就是对于Synch

转:C#中Monitor对象与Lock关键字的区别分析

Monitor对象1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()).2.Monitor的常用属性和方法: Enter(Object) 在指定对象上获取排他锁. Exit(Object) 释放指定对象上的排他锁. IsEnte

使用Lock(ReentrantLock)结合Condition实现自定义线程池

声明: 1.该篇只是提供一种自定义线程池的实现方式,可能性能.安全等方面需要优化: 2.该篇自定义线程池使用Lock(可重入锁ReentrantLock)结合Condition来实现: 3.该篇力求使用简单的方式呈现,如有错误之处,欢迎指正,在此表示感谢. 概述 自定义线程池三要素包括: 1.存储线程的容器(或叫线程池).该容器可使用数组或链表,容器中存放执行线程,本篇使用链表实现. 2.执行线程(或叫执行器).具体执行的线程. 3.执行任务.执行线程需要执行的具体任务. 代码 /** * 任务