java中常见的锁
-
乐观锁思想:当前环境读多写少,读数据的时候认为其它线程不会修改我的结果,写数据时再进行判断。进行CAS操作,如果当前值和我预期的值相同就更新。
-
悲观锁思想(互斥锁、同步锁):当前环境写多读少,遇到并发很大情况下会导致并发错误。每次去拿数据的时候都会去加锁,其它线程想拿数据时都会被阻塞。java中典型的有syc、ReentrantLock。读读、读写、写写互斥。
-
自旋锁技术:多核服务器下,多个线程并行执行。后面的线程在执行时,不会挂起。会不断自旋判断锁有没有释放。这样可以减少改变线程状态的开销。
-
可重入锁:线程A获取资源B后再次请求获取资源B。java中典型的有syc、ReentrantLock。避免死锁。注意申请了几把锁,就要释放几把锁。
-
读写锁:ReadWriteLock 控制锁的粒度,分成了读锁和写锁,读锁和写锁之间互斥,读锁和读锁不互斥。
-
公平锁思想:多线程按照申请锁的顺序获取锁,当请求获取锁时判断等待队列是不是空,是空获取锁,不是空就加在等待队列末尾排队获取锁。(先进先出)
-
非公平锁:多个线程获取资源时,不是按照先来先得的顺序获取锁的。有插队的行为。这样性能更好,插队(运行状态的线程获取锁)。等待队列线程获取锁(阻塞的线程先就绪再运行,才能获取锁)。缺点,可能导致线程饥饿。syc是非公平的,ReentrantLock可以通过构造函数指定是不是公平。
-
共享锁:多个线程获取读锁,ReadWriteLock
-
独占锁:ReentrantLock,syc
-
重量级锁:syc,syc是通过监视器锁实现。监视器锁依靠操作系统实现。
-
轻量级锁:没有竞争的情况下进行cas操作,减少其它开销。
-
偏向锁:锁偏向第一个获取他的线程A,当没有锁竞争时,A线程无需CAS就能获取锁。
-
分段锁:concurrent hashmap,分成16段。锁的并发度。多个线程同时插入,只要不是同一段就能并行。
Lock手动获取和释放锁,一个接口。
ReentrantLock实现了lock接口,显示调用lock和unlock方法。可以实现公平非公平,是API级别的。
syc自动释放锁,非公平。
原文地址:https://blog.csdn.net/m0_63803244/article/details/140646320
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!