作业3 主题资源网站建设,wordpress清晰笑话,做兼职比较好的网站,哈尔滨网络公司案例lock加锁解锁尝试获取锁方法lock底层基于什么实现lock和lock的底层实现分别面向什么用户lock和synchronized异同如何选择合适的锁ReentrantLock如何实现冲入内部类三个公平和非公平获取锁怎么实现的RL默认公平还是非公平#xff0c;构造参数ReentrantRedaWriteLock的特性什么是…lock加锁解锁尝试获取锁方法lock底层基于什么实现lock和lock的底层实现分别面向什么用户lock和synchronized异同如何选择合适的锁ReentrantLock如何实现冲入内部类三个公平和非公平获取锁怎么实现的RL默认公平还是非公平构造参数ReentrantRedaWriteLock的特性什么是AQS内部属性AQS的设计模式三类方法和对应作用实现自定义锁步骤同步队列的实现入队出对非公平所在队列中的竞争读写锁获取两个锁的方法读写锁的状态设计怎么做到的用一个int类型变量维护两个锁写锁和读锁获取和释放的场景支持所降级为什么阻塞更耗时自旋锁的默认重试次数自适应自旋锁引入版本怎么做的乐观所悲观所锁升级公平所和非公平所优缺点非可重入锁在重复调用同步资源为什么会死锁共享锁和排它锁jwt的缺点CPU同步各个核心的手段伪共享 lockunlocktryLockAQS队列同步器lock面向锁的使用者AQS面向锁的实现者如果我们想自定义一个所可以实现AQS相同点都能进行并发控制区别sycn使用起来不灵活只能对三种情况加锁lock更灵活可以自定义封锁对象。sync不用手动释放锁lock需要释放锁。sync是排他锁lock可以是排他锁也可以是共享锁如果需要用到lock的尝试锁的方法或者获取锁时可以被中断这些方法可以使用lock剩下的就用sync。sync在1.6之前性能确实不好1.6引入了锁的升级之后性能变好了而且lock需要手动释放通过计数器。当前线程获取锁之后会将锁的计数值count1释放锁会执行-1重入只需要将count即可当count为0才算彻底释放锁SyncFairSyncUonfairSync后两者继承自前者ReentrantLock实现公平非公平就是依靠后两者实现的通过同步队列实现对于一个要获取锁的线程公平锁会将其直接加在同步队列尾部非公平锁会首先尝试与队列头部有、竞争锁竞争成功就成功插队了否则也加入到同步队列中默认非公平锁因为实际场景需要用到公平锁的场景不多并且性能上非公平锁性能好吞吐量高传入参数true就是公平提供了共享锁内部有两种类型的锁共享锁和排他锁同时还是可重入锁。当当前线程获取到了写锁时当前线程还可以获取读锁但是其他线程不能获取任何锁不同线程间可以获取读锁队列同步器int类型的同步状态以及一个FIFO的同步队列status表示当前线程获取锁的次数模板模式第一类访问和修改同步状态第二类表示可重写的方法第三类表示模板方法定义了一些同步的基本操作1实现Lock接口2定义内部类sync继承AQS3实现Lock定义的方法实际上把锁的操作代理到了内部的AQS上同步队列实际上是由Node节点构成的链表每次都是对队列的首节点进行唤醒当首节点释放同步状态时将唤醒下一个节点同时自己出队。当有新的线程来的时候直接加入到尾节点非公平锁首先尝试和下一个要获得同步状态的节点竞争如果竞争成功就直接获得同步资源就不用入同步队列否则加入到同步队列尾部readLock(),writeLock()int32位高16位保存读锁的重入次数低16位保存写锁的重入次数写锁当前线程如果已经获取了写锁那么次数1否则尝试获取写锁如果此时其他线程占据写锁或者读锁那么进入阻塞等待读锁如果有其他线程占据写锁那么阻塞等待否则读锁当当前线程占据写锁时如果写操作执行完成想要读取数据则尝试获取读锁然后释放写锁因为大多数场景下并发执行的代码会很少占据的时间也就很少实际上我们稍等下就可以获取锁了但是如果阻塞的话会涉及到OS切换CPU状态这种状态转换是非常耗时的10次1.6版本让本次自选时间根据上一次在用一个锁上的自选时间来确定如果某个锁很少被占用很长时间或者过去的自旋尝试中很快就变为可用就让当前线程尝试自选更长的时间。乐观锁认为我想要操作的同步资源没人和我竞争所以我不会上锁典型的例子就是CAS他不上锁仅仅是在更新的时候比较一下这个值在我执行期间有没有变化变了就重新执行一遍否则更新。悲观锁认为一定有人和我竞争同步资源所以我直接上锁占着资源。典型的就是synchronized对象由三部分组成对象头实际数据填充字段。在对象头中保存了一些关键的信息比如hashcode锁信息等待。当有线程想要获取我这个锁资源时首先判断锁的对象头中的标志位最后三位是001代表未上锁此时当前线程获取锁资源同时对象头的信息转为偏向锁代表他偏向当前线程同时将线程的id记录在对象头。后续如果还是当前线程获取锁就直接让他访问即可不用加锁操作。当有其他线程竞争时由偏向锁升级为轻量级锁两个线程都通过CAS自旋来竞争所。当有多个线程竞争时有轻量级锁升级成重量级锁避免过多无用的自旋操作浪费cpu资源公平锁的获得顺序严格按照先到先得的思想不存在线程饥饿的现象但他降低了吞吐率线程切换情况较多。非公平锁虽然存在线程饥饿的现象但是他有效的利用cpu资源不涉及向公平锁一样那么多的线程切换吞吐率高当前线程占据锁但是他重复调用同步资源需要获取锁而当前的锁不能冲入且被他自己占据所以就导致他自己占着锁还等着获取锁造成死锁共享锁是允许多个线程同时获得的他们之间是不互斥的ReentrantReadWriteLock中的读锁就是一个典型的共享锁。排他锁不允许其他线程获得只能让当前线程独占比如写锁当当前线程持有写锁的时候其他线程既不能获得写锁也不能获取读锁服务器不保存session状态一旦token颁发了在到期之前都始终有效。安全性依赖于加密算法。一旦泄露其他人也能获取该token的权限。要保证写传播以及事务串行化通过MESI协议写直达把数据同时写入缓存和内存写回当缓存被替换的时候刷新到内存AB两个核心读取了同一个cache line对于一个数组的前两个数A要修改第一个B要修改第二个当A修改完第一个后即使和B无关B也要标记cache line失效然后重新读取。