龙空技术网

刨根问底之Java中同步锁synchronized与Lock的区别

大雨冲不垮的六队 100

前言:

此刻你们对“java互斥锁和同步锁”大体比较珍视,小伙伴们都需要知道一些“java互斥锁和同步锁”的相关内容。那么小编也在网上收集了一些对于“java互斥锁和同步锁””的相关资讯,希望我们能喜欢,朋友们快快来学习一下吧!

在谈锁的概念之前,我们先了解下并发的概念,并发简单来说指多个线程同时操作可变的共享资源。

稍微详细点来说需要分两个场景,同时多个线程在单核处理下运行,他们是需要进行切换,交替执行。CPU会给每个线程分配时间片,时间片很短,CPU频繁切换线程,所以给我们的感觉是同时运行;另外是多个线程在多核处理下,每个线程被分配到不同处理器上执行,因此是真正意义上的同时运行。(这里还会引发一个问题,如何解决CPU的频繁切换?因为频繁的切换同样会带来性能问题)

而锁就是为了避免多个线程在对同一个共享资源并发修改所带来的数据混乱。

锁又分为同步锁和互斥锁,同步锁:同步的概念就是排队,在多个线程在访问共享资源前进行拦截加锁和执行完操作后解锁,实现一个方法或者代码块只能由一个线程程序在执行。互斥锁:是针对对象而言的,即同一时间只能有一个线程获取该对象。

下面进入正题synchronized与Lock区别。

1、synchronized加锁和释放锁都由JVM提供,而Lock的加锁和释放锁需要我们自己显示的去实现,并且释放锁(unlock方法)一定要放到finally代码块中,否则容易造成死锁

2、synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

3、synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)

4、synchronized是Java一个关键字,是内置锁,synchronized放弃锁只有两种情况:1)线程执行完同步代码块 2)发生异常,所以可能会引起线程阻塞;而Lock是一个接口类,可以通过设置超时时间内未获取锁,来引导后续线程放弃操作。

感谢阅读与指正!

标签: #java互斥锁和同步锁 #互斥锁和同步锁区别