分享网站制作,如何免费制作网站,五莲建设监理有限公司网站,网站群建设需求文章目录 锁策略乐观锁和悲观锁乐观锁悲观锁两者的比较 读写锁重量级锁和轻量级锁重量级锁轻量级锁 自旋锁公平锁和非公平锁公平锁非公平锁 可重入锁和不可重入锁可重入锁不可重入锁 锁策略
乐观锁和悲观锁
乐观锁
什么是乐观锁呢#xff1f;我们可以认为乐观锁比较自信我们可以认为乐观锁比较自信当多线程执行的时候如果要对一个资源进行访问那么乐观锁会认为这些线程的访问是不会造成冲突的并且这些访问也不都是要进行修改。因此对这些线程访问更新的时候乐观锁才会进行检测查看这个进程的访问是否会造成冲突如果会的话就返回错误信息由用户决定是否如何去做
悲观锁
悲观锁相较于乐观锁也是一种极端悲观锁认为只要访问就一定会造成并发冲突因此悲观锁认为只要是访问资源都必须加上锁这样当别人想要获取这个资源的时候就必须获取这把锁陷入了阻塞等待当中。
两者的比较
这里我们举一个例子来说明 假如说甲乙两位同学向老师请问问题那么甲是一个悲观的人乙是一个乐观的人甲突然去找老师老师肯定在忙碌无法给自己将题目因此会先给老师发个消息询问老师是否在忙碌当得到老师的答复之后再决定是继续等待还是直接过去而乙则是比较乐观认为自己现在过去不会打扰到老师老师可以立即解答自己的疑惑因此乙就会直接过去询问老师问题这时候可能老师确实没有忙碌可以直接解决问题也有可能老师是在忙碌的这时候乙就需要进行等待了。 结论:两把锁各有特点针对于不同的场合使用不同的锁没有什么优劣性比较。
读写锁
读写锁。线程对一个资源的访问是分为读操作和写操作的那么对于一个资源来说读操作是不会导致线程不安全的只有写操作才会导致线程不安全因此线程对一个资源的访问加锁我们也可以分为读锁和写锁来进行因此我们就需要搞明白哪些情况会导致线程不安全 线程同时去读取一个数据安全的一批线程去读另一批线程在写不安全线程都在写不安全 因此读写锁也就诞生了那么读写锁是怎么进行加锁的呢按照字面意思肯定就是按照一个线程是读还是写来区别加锁了。那么既然是按照意图来进行区别加锁的我们首先当然要清除这个线程想要进行的操作是什么才可以来进行加锁。也就是加锁前需要获取这个线程的行为意图。 读写锁就是把读操作和写操作区分对待. Java 标准库提供了 ReentrantReadWriteLock 类, 实现了读写 锁. 我们来写一个示例代码运行一下查看
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class Lock_policy {public static int tmp10;public static final ReentrantReadWriteLock wrlocknew ReentrantReadWriteLock();public static void main(String[] args) {Thread t1new Thread(()-{wrlock.readLock().lock();System.out.println(我是t1线程tmp);//wrlock.readLock().unlock();});Thread t2new Thread(()-{wrlock.readLock().lock();System.out.println(我是t2线程tmp);//wrlock.readLock().unlock();});Thread t3new Thread(()-{wrlock.writeLock().lock();tmp;System.out.println(我是t3线程tmp);});t1.start();t2.start();}
}首先我们可以观察到这个代码中我们创建的t3线程并没有start运行因此我们测试的是当两个线程同时加上读锁并且读一个数据的时候是否会阻塞我们看一下运行结果。 结果很明显程序正常跑完因此没有任何的阻塞。我们来试试把t3线程运行试试结果。
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class Lock_policy {public static int tmp10;public static final ReentrantReadWriteLock wrlocknew ReentrantReadWriteLock();public static void main(String[] args) {Thread t1new Thread(()-{wrlock.readLock().lock();System.out.println(我是t1线程tmp);//wrlock.readLock().unlock();});Thread t2new Thread(()-{wrlock.readLock().lock();System.out.println(我是t2线程tmp);//wrlock.readLock().unlock();});Thread t3new Thread(()-{wrlock.writeLock().lock();tmp;System.out.println(我是t3线程tmp);});t1.start();t2.start();t3.start();}
}
运行截图如下 那么是否只有这一种结果呢当然不是。 在实验的过程中我们可能产生这些不同的结果那么这是为什么呢原因很简单那就是因为t3线程在t1和t2线程获取读锁之前就已经加上了写锁导致了t1和t2的读操作阻塞了。那么无论上述的哪种 结果都是可以说明读写锁中读锁和写锁是阻塞的。
重量级锁和轻量级锁
重量级锁
在理解这里的时候我们要先搞明白什么是重量级锁。顾名思义听名字就感觉这个锁很慢那么这种原因究竟是为什么呢这就要追溯到锁的一个机制了。 我们要搞明白加锁是为了干什么很简单加锁是为了保证我们的多个操作是原子性的。原子性的保证使得我们的操作避免了多线程的安全问题。那么为什么锁可以保证操作的原子性呢其实说白了还是因为我们的硬件设备的支持也就是底层建筑决定上层建筑因为我们的硬件支持所以我们的操作系统可以给我们提供一系列的锁的操作接口而操作系统提供的接口就是mutex。 CPU 提供了 “原子操作指令”.操作系统基于 CPU 的原子指令, 实现了 mutex 互斥锁.JVM 基于操作系统提供的互斥锁, 实现了 synchronized 和 ReentrantLock 等关键字和类 重量级锁加锁机制非常依赖于OS提供的mutex因此在加锁的时候涉及到大量的从内核态到用户态的转变效率较低。
轻量级锁
轻量级锁即加锁的时候尽量不依赖于mutex而是尽量在用户态代码完成. 实在搞不定了, 再使用 mutex。那么这时候有些美女或者帅哥可能就会很混乱说的直白一些就是轻量级锁就是尽量不去调用系统接口他就是一个优化。
自旋锁
什么是自旋锁呢那么按照我们之前写的代码当我们的锁被抢占的时候如果我们也想抢占这把锁的话就需要先进行阻塞等待也就是wait然后等待被唤醒可是我们不希望这样怎么办也就是说可能当前占有锁的这个进程很快就结束了就要释放这把锁了
公平锁和非公平锁
公平锁
公平锁遵守先来后到的原则B比C先来的那么当A释放锁之后B就会比C先获取到释放的锁
非公平锁
不遵守先来后到的原则synchronized就是一个非公平锁他的调度顺序是有操作系统决定的。 操作系统内部的线程调度就可以视为是随机的. 如果不做任何额外的限制, 锁就是非公平锁. 如果要 想实现公平锁, 就需要依赖额外的数据结构, 来记录线程们的先后顺序.公平锁和非公平锁没有好坏之分, 关键还是看适用场景. 可重入锁和不可重入锁
可重入锁
可重入的意思就是同一个线程可以多次获取同一把锁。也就是可以重新进入的锁。synchorinzed就是一把可重入锁。Java里只要以Reentrant开头命名的锁都是可重入锁而且JDK提供的所有现成的Lock实现类包括 synchronized关键字锁都是可重入的。
不可重入锁
不可重入锁就是当自己这个线程要重新申请这把锁的时候要进行等待便是不可重入锁。 文章转载自: http://www.morning.czqqy.cn.gov.cn.czqqy.cn http://www.morning.lbggk.cn.gov.cn.lbggk.cn http://www.morning.clhyj.cn.gov.cn.clhyj.cn http://www.morning.sphft.cn.gov.cn.sphft.cn http://www.morning.uqrphxm.cn.gov.cn.uqrphxm.cn http://www.morning.rdkt.cn.gov.cn.rdkt.cn http://www.morning.mnkhk.cn.gov.cn.mnkhk.cn http://www.morning.tpnxj.cn.gov.cn.tpnxj.cn http://www.morning.rmpfh.cn.gov.cn.rmpfh.cn http://www.morning.qkdbz.cn.gov.cn.qkdbz.cn http://www.morning.clnmf.cn.gov.cn.clnmf.cn http://www.morning.hdtcj.cn.gov.cn.hdtcj.cn http://www.morning.qnzld.cn.gov.cn.qnzld.cn http://www.morning.rfxyk.cn.gov.cn.rfxyk.cn http://www.morning.kybyf.cn.gov.cn.kybyf.cn http://www.morning.kpqjr.cn.gov.cn.kpqjr.cn http://www.morning.tnwgc.cn.gov.cn.tnwgc.cn http://www.morning.yxwrr.cn.gov.cn.yxwrr.cn http://www.morning.wspjn.cn.gov.cn.wspjn.cn http://www.morning.sjwqr.cn.gov.cn.sjwqr.cn http://www.morning.jqsyp.cn.gov.cn.jqsyp.cn http://www.morning.kdtdh.cn.gov.cn.kdtdh.cn http://www.morning.mlbdr.cn.gov.cn.mlbdr.cn http://www.morning.ybshj.cn.gov.cn.ybshj.cn http://www.morning.nqgds.cn.gov.cn.nqgds.cn http://www.morning.snbrs.cn.gov.cn.snbrs.cn http://www.morning.pcjw.cn.gov.cn.pcjw.cn http://www.morning.btns.cn.gov.cn.btns.cn http://www.morning.trbxt.cn.gov.cn.trbxt.cn http://www.morning.rnfwx.cn.gov.cn.rnfwx.cn http://www.morning.jqzns.cn.gov.cn.jqzns.cn http://www.morning.trtxt.cn.gov.cn.trtxt.cn http://www.morning.prkdl.cn.gov.cn.prkdl.cn http://www.morning.kxqpm.cn.gov.cn.kxqpm.cn http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.gjqwt.cn.gov.cn.gjqwt.cn http://www.morning.hwcgg.cn.gov.cn.hwcgg.cn http://www.morning.nwljj.cn.gov.cn.nwljj.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.frllr.cn.gov.cn.frllr.cn http://www.morning.pkpqh.cn.gov.cn.pkpqh.cn http://www.morning.hcrxn.cn.gov.cn.hcrxn.cn http://www.morning.mmsf.cn.gov.cn.mmsf.cn http://www.morning.ttdxn.cn.gov.cn.ttdxn.cn http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn http://www.morning.jfnbh.cn.gov.cn.jfnbh.cn http://www.morning.zmpqh.cn.gov.cn.zmpqh.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.rgmd.cn.gov.cn.rgmd.cn http://www.morning.tkrwm.cn.gov.cn.tkrwm.cn http://www.morning.dkqbc.cn.gov.cn.dkqbc.cn http://www.morning.ybhjs.cn.gov.cn.ybhjs.cn http://www.morning.nfcxq.cn.gov.cn.nfcxq.cn http://www.morning.sfsjh.cn.gov.cn.sfsjh.cn http://www.morning.ynryz.cn.gov.cn.ynryz.cn http://www.morning.mwnch.cn.gov.cn.mwnch.cn http://www.morning.yntsr.cn.gov.cn.yntsr.cn http://www.morning.jlpdc.cn.gov.cn.jlpdc.cn http://www.morning.qfplp.cn.gov.cn.qfplp.cn http://www.morning.yjfzk.cn.gov.cn.yjfzk.cn http://www.morning.jydky.cn.gov.cn.jydky.cn http://www.morning.kkzwn.cn.gov.cn.kkzwn.cn http://www.morning.dkqyg.cn.gov.cn.dkqyg.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.wddmr.cn.gov.cn.wddmr.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.alwpc.cn.gov.cn.alwpc.cn http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn http://www.morning.gmwdl.cn.gov.cn.gmwdl.cn http://www.morning.gsqw.cn.gov.cn.gsqw.cn http://www.morning.fmrrr.cn.gov.cn.fmrrr.cn http://www.morning.xnflx.cn.gov.cn.xnflx.cn http://www.morning.mxmdd.cn.gov.cn.mxmdd.cn http://www.morning.nyzmm.cn.gov.cn.nyzmm.cn http://www.morning.nzxdz.cn.gov.cn.nzxdz.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.zczkm.cn.gov.cn.zczkm.cn http://www.morning.rnfwx.cn.gov.cn.rnfwx.cn http://www.morning.znqfc.cn.gov.cn.znqfc.cn http://www.morning.beeice.com.gov.cn.beeice.com