定制高端网站建设公司,杭州优化公司哪家好,wordpress禁用导航栏代码,网上找兼职的网站ReadWriteLock包括两种子锁
#xff08;1#xff09;ReadWriteLock
ReadWriteLock 可以实现多个读锁同时进行#xff0c;但是读与写和写于写互斥#xff0c;只能有一个写锁线程在进行。
#xff08;2#xff09;StampedLock
StampedLock是Jdk在1.8提供的一种读写锁1ReadWriteLock
ReadWriteLock 可以实现多个读锁同时进行但是读与写和写于写互斥只能有一个写锁线程在进行。
2StampedLock
StampedLock是Jdk在1.8提供的一种读写锁相比较ReentrantReadWriteLock性能更好因为ReentrantReadWriteLock在读写之间是互斥的使用的是一种悲观策略在读线程特别多的情况下会造成写线程处于饥饿状态虽然可以在初始化的时候设置为true指定为公平但是吞吐量又下去了而StampedLock是提供了一种乐观策略更好的实现读写分离并且吞吐量不会下降。
StampedLock包括三种锁
1写锁writeLock
writeLock是一个独占锁写锁当一个线程获得该锁后其他请求读锁或者写锁的线程阻塞 获取成功后会返回一个stamp凭据变量来表示该锁的版本在释放锁时调用unlockWrite方法传递stamp参数。提供了非阻塞式获取锁tryWriteLock。
2悲观读锁readLock
readLock是一个共享读锁在没有线程获取写锁情况下多个线程可以获取该锁。如果有写锁获取那么其他线程请求读锁会被阻塞。悲观读锁会认为其他线程可能要对自己操作的数据进行修改所以需要先对数据进行加锁这是在读少写多的情况下考虑的。请求该锁成功后会返回一个stamp值在释放锁时调用unlockRead方法传递stamp参数。提供了非阻塞式获取锁方法tryWriteLock。
3乐观读锁tryOptimisticRead
tryOptimisticRead相对比悲观读锁在操作数据前并没有通过CAS设置锁的状态如果没有线程获取写锁则返回一个非0的stamp变量获取该stamp后在操作数据前还需要调用validate方法来判断期间是否有线程获取了写锁如果是返回值为0则有线程获取写锁如果不是0则可以使用stamp变量的锁来操作数据。由于tryOptimisticRead并没有修改锁状态所以不需要释放锁。这是读多写少的情况下考虑的不涉及CAS操作所以效率较高在保证数据一致性上需要复制一份要操作的变量到方法栈中并且在操作数据时可能其他写线程已经修改了数据而我们操作的是方法栈里面的数据也就是一个快照所以最多返回的不是最新的数据但是一致性得到了保证。