Java锁机制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java锁机制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2705字,纯文字阅读大概需要4分钟。
内容图文
![Java锁机制](/upload/InfoBanner/zyjiaocheng/624/d990cc1a554b4596830e021b310da740.jpg)
上一篇简略说了一下Synchronized和Lock,今天就来说一下Java的锁机制。
Java的锁机制主要分为四种,分别是
(1)公平锁、非公平锁
(2)可重入锁
(3)自旋锁
(4)共享锁、独占锁
接下来一一说一下这四种锁
一、公平锁、非公平锁
(1)公平锁:指多个线程按照申请锁的顺序来获取锁,类似于日常的排队
(2)非公平锁:多个线程获取锁的顺序并不是按照申请锁的顺序来,通俗来说就是插队
(3)ReentrantLock默认是非公平的
public ReentrantLock() { sync = new NonfairSync(); }
也可以是公平的
public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }
另外,synchronized也是非公平的,非公平的吞吐量比较大
(4)区别:公平锁会维护一个先进先出的线程等待队列,非公平锁是直接获取锁,上去就干,干不过人家再采取公平锁的方式。
公平锁:
![Java锁机制 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501032914583.jpg)
非公平锁:
![Java锁机制 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501032914756.jpg)
二、可重入锁(又叫递归锁)
(1)是指同一线程外层函数获取锁之后,内层递归函数仍然能持有锁继续运行。
ReentrantLock和synchronized都是可重入锁,比如下面这个demo
static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { first(); } }).start(); } } public static void first() { lock.lock(); try{ System.out.println(Thread.currentThread().getName()+":11111111111"); Thread.sleep(1000); second(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void second() { lock.lock(); try{ System.out.println(Thread.currentThread().getName()+":22222222222"); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }
运行结果如下:
![Java锁机制 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501032915221.jpg)
(2)可重入锁最大的作用就是避免死锁
(3)上一篇也说到了,ReentrantLock可以锁多次,但同样也要释放锁多次。因为锁是有一个状态字段state标明锁状态的,每锁一次就+1,解锁一个就-1,只有状态为0,才是完全解锁。
public static void first() { lock.lock(); lock.lock(); try{ System.out.println(Thread.currentThread().getName()+":11111111111"); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); lock.unlock(); } }
三、自旋锁
自旋锁在之前解析原子性时就说过了,主要是通过Unsafe+cas实现。
指尝试获取锁的线程不会阻塞,而是采用死循环的方式去尝试获取锁,会消耗大量的cpu
例如:
AtomicReference<Integer> atomicReference = new AtomicReference<>(0); public void zxLock(){ while (!atomicReference.compareAndSet(0,1)) { } }
四、独占锁(写锁)、共享锁
(1)独占锁:指锁在某一时刻只能由一个线程持有,比如ReentrantLock和synchronized。
(2)共享锁:指锁可以同时被多个线程持有。
对于ReentrantReadWriteLock来说,其由ReadLock(写锁)和WriteLock(读锁),其中写锁是独占锁,读锁是共享锁,保证高并发。读写,写读,写写的过程是互斥的。其这些特性可用于缓存机制。
=======================================================
我是Liusy,一个喜欢健身的程序员。
提前祝大家伙中秋国庆快乐!!!
欢迎关注微信公众号【Liusy01】,一起交流Java技术及健身,获取更多干货。
![Java锁机制 - 文章图片](/upload/getfiles/0001/2021/5/1/20210501032915285.jpg)
内容总结
以上是互联网集市为您收集整理的Java锁机制全部内容,希望文章能够帮你解决Java锁机制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。