我是靠谱客的博主 直率咖啡豆,最近开发中收集的这篇文章主要介绍synchronized和lock两种锁的比较,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

两者区别:

1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类

2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁 tryLock方法

3.synchronized会自动释放锁(a线程执行完同步代码会释放锁;b线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁

4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了(设置时间范围内未获取到锁执行下面的补偿程序)

5.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题

关于等待可中断锁和判断锁状态可参考代码: synchronized与Lock的区别 - 搬砖真累 - 博客园

synchronized底层实现原理及锁优化

synchronized作用

原子性:synchronized保证语句块内操作是原子的

可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)

有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)

synchronized的使用

修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁

修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁

修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

实现原理:jvm基于进入和退出Monitor对象来实现方法同步和代码块同步

1.synchronized和lock的用法区别

synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。

lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

 2.synchronized和lock性能区别

synchronized是托管给JVM执行的,而lock是java写的控制锁的代码。

synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁;而Lock用的是乐观锁方式,实现的机制是CAS操作

最后

以上就是直率咖啡豆为你收集整理的synchronized和lock两种锁的比较的全部内容,希望文章能够帮你解决synchronized和lock两种锁的比较所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部