当前位置: 首页 > news >正文

微信网站下载高端炫酷h5怎么制作

微信网站下载,高端炫酷h5怎么制作,做网站必须要推广吗,河北建设工程招标信息网官网1 介绍 为什么要使用读写锁? 需要高并发读取和较低并发写入的应用程序,降低锁的粒度,提高系统性能 使用场景: 读多写少的共享资源 缓存管理:读 >> 写,控制多个线程同时读缓存,需要刷新o…

1 介绍

为什么要使用读写锁?

        需要高并发读取和较低并发写入的应用程序,降低锁的粒度,提高系统性能

使用场景

        读多写少的共享资源

        缓存管理:读 >> 写,控制多个线程同时读缓存,需要刷新or修改操作时才使用写锁

        数据库连接池:多个线程从池中获取连接(读操作),只有一个线程可以设置连接到池中(写操作)

        文件读写

        数据结构的并发访问

2 使用

import java.util.concurrent.locks.ReentrantReadWriteLock;public class SharedResource {private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();private final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();public void readFromResource() {readLock.lock(); // 获取读锁try {// 执行读取共享资源的操作} finally {readLock.unlock(); // 释放读锁}}public void writeToResource() {writeLock.lock(); // 获取写锁try {// 执行写入共享资源的操作} finally {writeLock.unlock(); // 释放写锁}}
}

3 原理分析

读写锁两个状态,读状态、写状态

但AQS中只有一个state,如何记录两种状态?

        高低位;int4个字节,共32位,采用高16位控制读,低16位控制写

00000000 00000000 00000000 00000000

加锁时如何判断读锁、写锁?

        高16位>0,表示有读锁(sharedCount())

        低16位>0,表示有写锁(exclusiveCount())

如何实现可重入?

        写锁只有一个线程独占,重入则低16位+1即可

        写锁有多个线程持有,如何记录?ThreadLocal线程私有

4 读锁源码

读锁:tryAcquireShared()、tryReleaseShared();读读共享

protected final int tryAcquireShared(int unused) {Thread current = Thread.currentThread();int c = getState();//是否其它线程占用排它锁,如果是则不允许获取共享锁if (exclusiveCount(c) != 0 &&getExclusiveOwnerThread() != current)return -1;//共享锁被获取的数量int r = sharedCount(c);//获取共享锁//1 未阻塞//2 不超最大读计数//3 设置共享锁成功if (!readerShouldBlock() &&r < MAX_COUNT &&compareAndSetState(c, c + SHARED_UNIT)) {//第一次读if (r == 0) {firstReader = current;firstReaderHoldCount = 1;//重入} else if (firstReader == current) {firstReaderHoldCount++;} else {//其它线程读HoldCounter rh = cachedHoldCounter;if (rh == null || rh.tid != getThreadId(current))//记录每个线程的重入次数cachedHoldCounter = rh = readHolds.get();else if (rh.count == 0)readHolds.set(rh);rh.count++;}return 1;}//若不满足上述条件,则执行方法内的获取共享锁逻辑return fullTryAcquireShared(current);}
final int fullTryAcquireShared(Thread current) {HoldCounter rh = null;//1 自旋 获取共享锁or失败for (;;) {int c = getState();//2 若存在写锁,且不是当前线程持有的,不允许获取共享锁if (exclusiveCount(c) != 0) {if (getExclusiveOwnerThread() != current)return -1;//3 读线程阻塞} else if (readerShouldBlock()) {if (firstReader == current) {} else {if (rh == null) {rh = cachedHoldCounter;if (rh == null || rh.tid != getThreadId(current)) {rh = readHolds.get();if (rh.count == 0)readHolds.remove();}}if (rh.count == 0)return -1;}}// 4 不允许再申请共享锁if (sharedCount(c) == MAX_COUNT)throw new Error("Maximum lock count exceeded");// 5 尝试获取锁if (compareAndSetState(c, c + SHARED_UNIT)) {if (sharedCount(c) == 0) {firstReader = current;firstReaderHoldCount = 1;} else if (firstReader == current) {firstReaderHoldCount++;} else {if (rh == null)rh = cachedHoldCounter;if (rh == null || rh.tid != getThreadId(current))rh = readHolds.get();else if (rh.count == 0)readHolds.set(rh);rh.count++;cachedHoldCounter = rh; // cache for release}return 1;}}}

5 写锁源码

写锁:tryAcquire()、tryRelease();写写互斥,读写互斥

protected final boolean tryAcquire(int acquires) {Thread current = Thread.currentThread();int c = getState();int w = exclusiveCount(c);if (c != 0) {// (Note: if c != 0 and w == 0 then shared count != 0)if (w == 0 || current != getExclusiveOwnerThread())return false;if (w + exclusiveCount(acquires) > MAX_COUNT)throw new Error("Maximum lock count exceeded");// Reentrant acquiresetState(c + acquires);return true;}if (writerShouldBlock() ||!compareAndSetState(c, c + acquires))return false;setExclusiveOwnerThread(current);return true;}

http://www.15wanjia.com/news/174672.html

相关文章:

  • 策划与设计一个电子商务网站如何在线上销售自己的产品
  • 怎么做国外的网站吗个人备案可以做盈利网站吗
  • 网站服务器申请263企业邮箱手机入口登录
  • 网站建设的工作内容服务器如何搭建网站
  • 阿里云有主体新增网站大学生个人网页设计理念
  • 小企业网站建设价格怎么给自己的网站做排名
  • 在天津做网站的公司给前端做网站的图片叫什么软件
  • 东莞企业网站公司怎么创建免费自己的网站平台
  • 17做网店这个网站好不好vr开发公司
  • 搜索网站 模板网站建设静态部分报告总结
  • 电商系统网站开发多样化的网站建设公司
  • 做网站的软件是是什么物流网站和数据库建设
  • 小游戏网站欣赏无需下载直接观看的正能量
  • 大型门户网站建设需要哪些技术怎样用自己的电脑做网站
  • wordpress图文直播插件seo是什么服务
  • 给网站做优化怎么做网站建设需要材料
  • 镇江建站怎么用ppt做网站设计
  • 网站建设设计说明建分类网站得花多少钱
  • 做兼职什么网站好大连公司名称大全
  • 什么网站做的最好淮南最新消息今天发布
  • 公众号链接网站都是怎么做的网站建设下载模板之后怎么修改
  • 广州网络推广公司电话google seo实战教程
  • 网站空间租用多少钱网站建设前期策划方案
  • 福州网站建设思企做外贸的网站平台有哪些
  • wordpress门户建站医疗器械查询
  • 系统官网网站模板哈尔滨网站建设教学
  • 塘沽网站建设专做蔬菜大棚的网站
  • 网站高质量链群怎么做长宁广州网站建设
  • 郑州加盟网站建设品牌价值
  • 秦皇岛网站制作小程序开发网站内链怎么优化