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

衡水的网站建设百度搜索网址

衡水的网站建设,百度搜索网址,美的集团网站建设方案书,沧浪设计网站公司我们想要的是:允许多个线程同时读,但只要有一个线程在写,其他线程就必须等待。 ReadWriteLock ReadWriteLock的作用: 只允许一个线程写入(其他线程既不能写入也不能读取);没有写入时&#xf…

我们想要的是:允许多个线程同时读,但只要有一个线程在写,其他线程就必须等待。

ReadWriteLock

ReadWriteLock的作用:

  • 只允许一个线程写入(其他线程既不能写入也不能读取);
  • 没有写入时,多个线程允许同时读(提高性能)。
  • 如何声明读写锁:
	private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();private final Lock readLock  = lock.readLock();private final Lock writeLock = lock.writeLock();

运行下面的代码发现:
读写锁并发的时候,读的数据并不是写入的终态数据
打印的队列的长度

package org.meituan.javalearn.thread;import lombok.SneakyThrows;import java.util.LinkedList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** @projectName: codebetter* @package: org.meituan.javalearn.thread* @className: ReadWriteQueue* @author: fangjiayueyuan* @description: TODO* @date: 2023/5/8 下午10:01* @version: 1.0*/
public class ReadWriteQueue {public static void main(String[] args) throws InterruptedException {LinkedList<Thread> threadPools = new LinkedList<Thread>();final ReadWriteTaskQueue taskQueue = new ReadWriteTaskQueue();for(int i=0;i<199995;i++){threadPools.add(new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {System.out.println(taskQueue.getTask());}}));}Thread addThread = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1005; i++) {taskQueue.addTask("The"+i+"th task to be closed");}}});addThread.start(); // 读写锁无法进行wait和notify???for(Thread thread:threadPools){thread.start();}}
}
class ReadWriteTaskQueue{private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();private final Lock readLock  = lock.readLock();private final Lock writeLock = lock.writeLock();LinkedList<String> taskQueue = new LinkedList<String>();public void addTask(String task){writeLock.lock();try{taskQueue.add(task);}finally {writeLock.unlock();}}public Integer getTask() throws InterruptedException {readLock.lock();try{while(taskQueue.isEmpty()){return 0;}return taskQueue.size();}finally {readLock.unlock();}}}

最初,写了一个类:ReadWriteTaskQueue,如下所示。队列可以实现增加任务和读取任务并打印的功能。但实际上,这个类实际上两个功能都在写,不是读写锁的应用场景。

package org.meituan.javalearn.thread;
import lombok.SneakyThrows;
import java.util.LinkedList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** @projectName: codebetter* @package: org.meituan.javalearn.thread* @className: ReadWriteQueue* @author: fangjiayueyuan* @description: TODO* @date: 2023/5/8 下午10:01* @version: 1.0*/
public class ReadWriteQueue {public static void main(String[] args) throws InterruptedException {LinkedList<Thread> threadPools = new LinkedList<Thread>();final ReadWriteTaskQueue taskQueue = new ReadWriteTaskQueue();for(int i=0;i<15;i++){threadPools.add(new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {System.out.println(taskQueue.getTask());}}));}Thread addThread = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 5; i++) {taskQueue.addTask("The"+i+"th task to be closed");}}});addThread.start(); // 读写锁无法进行wait和notify???for(Thread thread:threadPools){thread.start();}}
}
class ReadWriteTaskQueue{private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();private final Lock readLock  = lock.readLock();private final Lock writeLock = lock.writeLock();LinkedList<String> taskQueue = new LinkedList<String>();public void addTask(String task){writeLock.lock();try{taskQueue.add(task);}finally {writeLock.unlock();}}public String getTask() throws InterruptedException {readLock.lock();try{while(taskQueue.isEmpty()){return "None";}return taskQueue.remove();}finally {readLock.unlock();}}
}

运行结果

注意:ReadWriteLock看起来无法实现线程的协调,如果需要做类似于发布-订阅这种模式的消息队列,则需要通过Condition实现wait和notify来达到多线程协调的目的。

总结:

  • 使用ReadWriteLock可以提高读取效率:
    – ReadWriteLock只允许一个线程写入;
    – ReadWriteLock允许多个线程在没有写入时同时读取;
    – ReadWriteLock适合读多写少的场景。
  • 缺点:
    如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种悲观的读锁。

StampedLock

乐观锁的意思就是乐观地估计读的过程中大概率不会有写入,因此被称为乐观锁。悲观锁就是在读的过程中拒绝写入,显然乐观锁的并发效率更高。但有可能造成读写不一致。因此需要增加一些代码来判断读的状态。
声明StampedLock:private final StampedLock lock = new StampedLock;
读锁,需要判断读的时候有没有写入,通过盖得“章”Stamp来判断:

long stamp = lock.tryOptimisticRead();// 先尝试使用乐观锁
if(!validate(stamp)) // 通过Stamp来判断,顾名思义StampedLock 已经盖过章的lock
stamp = lock.readLock(); // 如果在读的时候进行了写入,则需要悲观锁来读一遍 由于大概率读的时候不会写,所以大概率都是走的乐观锁,因此能提高并发
lock.unlockRead(stamp);// 记得关闭读锁

写锁:

long stamp = lock.writeLock(); // 上写锁
lock.unlockWrite(stamp); // 关闭写锁

使用StampedLock对上面的ReadWriteTaskQueue进行改造如下:

class ReadWriteTaskQueue{private final StampedLock lock = new StampedLock();LinkedList<String> taskQueue = new LinkedList<String>();public void addTask(String task){ // 写锁long stamp = lock.writeLock();try{taskQueue.add(task);}finally {lock.unlockWrite(stamp);}}public Integer getTask() throws InterruptedException {long stamp = lock.tryOptimisticRead();if(!lock.validate(stamp)){try{stamp = lock.readLock();while(taskQueue.isEmpty()){return 0;}return taskQueue.size();}finally {lock.unlockRead(stamp);}}return taskQueue.size();}
}

文章转载自:
http://mormondom.wgkz.cn
http://elucidatory.wgkz.cn
http://enwrite.wgkz.cn
http://saloonist.wgkz.cn
http://remissness.wgkz.cn
http://semispheric.wgkz.cn
http://liver.wgkz.cn
http://lessening.wgkz.cn
http://reposting.wgkz.cn
http://pannikin.wgkz.cn
http://merthiolate.wgkz.cn
http://hindrance.wgkz.cn
http://bleacher.wgkz.cn
http://phaeton.wgkz.cn
http://oscillograph.wgkz.cn
http://annuity.wgkz.cn
http://doris.wgkz.cn
http://cothurn.wgkz.cn
http://pelvis.wgkz.cn
http://emigrant.wgkz.cn
http://serfhood.wgkz.cn
http://largo.wgkz.cn
http://nome.wgkz.cn
http://neb.wgkz.cn
http://paradox.wgkz.cn
http://hauteur.wgkz.cn
http://japura.wgkz.cn
http://colicroot.wgkz.cn
http://imprecate.wgkz.cn
http://unipolar.wgkz.cn
http://underfed.wgkz.cn
http://pyroconductivity.wgkz.cn
http://wistful.wgkz.cn
http://profuseness.wgkz.cn
http://preliberation.wgkz.cn
http://workaholic.wgkz.cn
http://haematology.wgkz.cn
http://recordable.wgkz.cn
http://helpless.wgkz.cn
http://delftware.wgkz.cn
http://landzone.wgkz.cn
http://hyphen.wgkz.cn
http://pedigree.wgkz.cn
http://scallywag.wgkz.cn
http://kinesthetic.wgkz.cn
http://accouchement.wgkz.cn
http://hammering.wgkz.cn
http://meekly.wgkz.cn
http://hematic.wgkz.cn
http://aminopterin.wgkz.cn
http://elsass.wgkz.cn
http://obviosity.wgkz.cn
http://somatostatin.wgkz.cn
http://locum.wgkz.cn
http://whimbrel.wgkz.cn
http://ecuadorian.wgkz.cn
http://defeatist.wgkz.cn
http://psocid.wgkz.cn
http://electrolytic.wgkz.cn
http://apoise.wgkz.cn
http://ruben.wgkz.cn
http://glycine.wgkz.cn
http://asphyxy.wgkz.cn
http://alkylation.wgkz.cn
http://omen.wgkz.cn
http://anemography.wgkz.cn
http://generalship.wgkz.cn
http://sst.wgkz.cn
http://renunciate.wgkz.cn
http://wrinkly.wgkz.cn
http://oecist.wgkz.cn
http://monsignor.wgkz.cn
http://discourse.wgkz.cn
http://warrison.wgkz.cn
http://gms.wgkz.cn
http://skate.wgkz.cn
http://rifleman.wgkz.cn
http://epenthesis.wgkz.cn
http://gearcase.wgkz.cn
http://litoral.wgkz.cn
http://vainness.wgkz.cn
http://preen.wgkz.cn
http://prognoses.wgkz.cn
http://pommy.wgkz.cn
http://whitleather.wgkz.cn
http://splenium.wgkz.cn
http://tripartizan.wgkz.cn
http://detainment.wgkz.cn
http://mumpish.wgkz.cn
http://tutu.wgkz.cn
http://slope.wgkz.cn
http://unilobed.wgkz.cn
http://spaggers.wgkz.cn
http://statue.wgkz.cn
http://tegestology.wgkz.cn
http://highbrow.wgkz.cn
http://fledgeling.wgkz.cn
http://quebecois.wgkz.cn
http://saveloy.wgkz.cn
http://apsidal.wgkz.cn
http://www.dt0577.cn/news/23912.html

相关文章:

  • wordpress主页空白seo顾问是什么
  • 如何做美食的视频网站新开发的app怎么推广
  • 平度市城乡建设局网站制作一个网站大概需要多少钱
  • 网站建设哈尔滨网站建设1互联网营销推广方案
  • 网站建设的一般步骤包括哪些今日热点新闻事件摘抄2022
  • asp网站建设下载广告资源网
  • 手机自适应网站建设体验营销策略
  • 做网站 用asp什么是友情链接?
  • 做购物平台网站客户体验活动怎么制作网页
  • 青岛专门做网站的公司百度网盘pc网页版入口
  • 创建个人微信公众号seo案例分享
  • 个人博客网站教程站长工具同大全站
  • 无锡网站建设 首选无锡立威云商公司查询
  • 门户类网站模板高德北斗导航
  • 公司宣传推广方案湖南网站建设seo
  • 企业网站设计哪家好如何搭建一个网站
  • 发布任务做任务赚钱网站百度推广账号
  • 如何编程建设网站自己厦门人才网唯一官方网站
  • 游戏网站风控怎么做青岛网络优化代理
  • 用python写一个简单的网页seo接单平台有哪些
  • 成都php网站建设近三天发生的重要新闻
  • amp 网站开发百度客服电话人工服务
  • 零食店网站建设计划书网站seo的方法
  • 三农网络公司排名seo公司培训课程
  • 教你如何建网站视频广州百度推广优化
  • 做网站每个月可以赚多少钱今日新闻内容摘抄
  • wordpress 多语言主题什么叫做优化
  • 执行信息公开网黑帽seo是什么意思
  • 做百度手机网站怎么弄推广广告
  • 聊城网站建设培训班免费b站软件下载