Web全栈~34.CAS

article/2025/11/8 16:24:07

Web全栈~34.CAS

上一期

原子变量

Java并发包中的原子变量有以下几种

       AtomicBoolean:原子Boolean类型,常用来在程序中表示一个标志位。

       AtomicInteger:原子Integer类型。

       AtomicLong:原子Long类型,常用来在程序中生成唯一序列号。

       AtomicReference:原子引用类型,用来以原子方式更新复杂类型。

       除了这4个类,还有一些其他类,如针对数组类型的类AtomicLongArray、AtomicReferenceArray,以及用于以原子方式更新对象中的字段的类,如AtomicIntegerFieldUpdater、AtomicReferenceFieldUpdater等。

       Java 8增加了几个类,在高并发统计汇总的场景中更为适合,包括LongAdder、LongAccumulator、Double-Adder和DoubleAccumulator

AtomicInteger

       AtomicInteger有两个构造方法,第一个给定初始值,第二个初始值为0

在这里插入图片描述

       可以直接获取或设置AtomicInteger中的值,方法是

在这里插入图片描述

       之所以称为原子变量,是因为它包含一些以原子方式实现组合操作的方法

//以原子方式获取旧值并设置新值
public final int getAndSet(int newValue)
//以原子方式获取旧值并给当前值加1
public final int getAndIncrement()
//以原子方式获取旧值并给当前值减1
public final int getAndDecrement()
//以原子方式获取旧值并给当前值加delta
public final int getAndAdd(int delta)
//以原子方式给当前值加1并获取新值
public final int incrementAndGet()
//以原子方式给当前值减1并获取新值
public final int decrementAndGet()
//以原子方式给当前值加delta并获取新值
public final int addAndGet(int delta)

       这些方法的实现都依赖另一个public方法:

public final boolean compareAndSet(int expece,int update)

       compareAndSet是一个非常重要的方法,比较并设置,简称为CAS。

       该方法有两个参数expect和update,以原子方式实现了如下功能:如果当前值等于expect,则更新为update,否则不更新,如果更新成功,返回true,否则返回false。AtomicInteger可以在程序中用作一个计数器,多个线程并发更新,也总能实现正确性。

public class Test extends Thread{private static AtomicInteger counter = new AtomicInteger(0);static class Visitor extends Thread {@Overridepublic void run() {for(int i = 0; i < 1000; i++) {counter.incrementAndGet();}}}public static void main(String[]args) throws InterruptedException {int num = 1000;Thread[]threads = new Thread[num];for(int i = 0; i < num; i++) {threads[i]= new Visitor();threads[i].start();}for(int i = 0; i < num; i++) {threads[i].join();}System.out.println(counter.get());}
}

基本原理和思维

       AtomicInteger的使用方法是简单直接的,它的主要内部成员是 :

//它的声带有volatile,这是必须的,以保证内存可见性
private volatile int value;

       它的大部分更新方法实现都类似

public final int incrementAndGet() {for(;;) {int current = get();int next = current + 1;ifcompareAndSet(current,next))return next;}
}

       代码主体是个死循环,先获取当前值current,计算期望的值next,然后调用CAS方法进行更新,如果更新没有成功,说明value被别的线程改了,则再去取最新值并尝试更新直到成功为止。

       与synchronized锁相比,这种原子更新方式代表一种不同的思维方式。synchronized是悲观的,它假定更新很可能冲突,所以先获取锁,得到锁后才更新。原子变量的更新逻辑是乐观的,它假定冲突比较少,但使用CAS更新,也就是进行冲突检测,如果确实冲突了,那也没关系,继续尝试就好了。synchronized代表一种阻塞式算法,得不到锁的时候,进入锁等待队列,等待其他线程唤醒,有上下文切换开销。原子变量的更新逻辑是非阻塞式的,更新冲突的时候,它就重试,不会阻塞,不会有上下文切换开销。对于大部分比较简单的操作,无论是在低并发还是高并发情况下,这种乐观非阻塞方式的性能都远高于悲观阻塞式方式。

       原子变量相对比较简单,但对于复杂一些的数据结构和算法,非阻塞方式往往难于实现和理解,幸运的是,Java并发包中已经提供了一些非阻塞容器,我们只需要会使用就可以了

       除了可以实现乐观非阻塞算法之外,还可以实现悲观阻塞式算法,比如锁。实际上,Java并发包中的所有阻塞式工具、容器、算法也都是基于CAS的

public class Test extends Thread{private AtomicInteger status = new AtomicInteger(0);public void lock() {while(!status.compareAndSet(0,1)) {Thread.yield();}}public void unlock() {status.compareAndSet(1,0);}
}

       使用status表示锁的状态,0表示未锁定,1表示锁定,lock()、unlock()使用CAS方法更新,lock()只有在更新成功后才退出,实现了阻塞的效果,不过一般而言,这种阻塞方式过于消耗CPU


http://chatgpt.dhexx.cn/article/vAV7Ubn1.shtml

相关文章

PythonWeb全栈开发介绍

文章目录 1 什么是Web开发2 Python Web开发技能点3 什么是全栈开发4 技术选型如何开始 1 什么是Web开发 权威定义 Web&#xff08;World Wide Web&#xff09;即全球广域网也称为万维网&#xff0c;它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息…

Web全栈~17.购物车案例(JavaScript动态效果)

Web全栈~17.购物车案例(JavaScript动态效果) 上一期 前言 前三期已经对购物车的样式绘制完毕,那么这一期就用JavaScript来实现动态效果。 全选 思路 可以在input标签里,添加单击事件,并且传递一个this。这个this就会把input本身传递过去。 <li><input type"ch…

java web全栈_web全栈java开发哪个前景好

展开全部 全栈和java哪个能更好62616964757a686964616fe58685e5aeb931333365633862迎合市场需求&#xff0c;有同学咨询学习哪个在以后前景和工作薪水上能更吃香&#xff0c;首先我们先来了解下Java开发和全栈开发的区别。 全栈开发工程师是指掌握多种技能&#xff0c;能够独立…

Web全栈开发基础(小白入门版本)

博客传送门 近几个月认真写了写Web全栈代码&#xff0c;有点小收获这里分享一下。我还做了个PPT&#xff0c;资源路径 欢迎拍砖指点&#xff01; Web全栈开发是一个听起来很虎的名词。本文从技术层面解释全栈开发&#xff0c;能帮助没有全栈概念&#xff0c;或者说对相关技术…

web全栈开发项目搭建整体思路和学习路线

web全栈开发 全栈开发技术介绍&#xff1a; 全栈技术指可以完整整个项目搭建的有效集合。 包括&#xff1a;网站的设计&#xff0c;web前端开发&#xff0c;web后端开发&#xff0c;数据库设计&#xff0c;接口和组件&#xff0c;移动端开发&#xff0c;产品设计&#xff0c;系…

mysql建立索引的几大原则

1&#xff0e;选择唯一性索引 唯一性索引的值是唯一的&#xff0c;可以更快速的通过该索引来确定某条记录。例如&#xff0c;学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话&#xff0c;可能存在同名现象&#xff0c…

MySQL建立索引的正确姿势与使用索引的最佳指南!

引言 数据库索引&#xff0c;绝对是MySQL的核心功能之一&#xff0c;如果没有索引机制的数据库&#xff0c;那数据的检索效率绝对是令人无法接受的&#xff0c;毕竟没有索引的表数据&#xff0c;就如同一个普通的文本文件存储在磁盘中。在《索引上篇》中&#xff0c;我们对于M…

mysql创建索引语句

1:表结构 2:创建索引语句 alter table staffs add index idx_staffs_nameAgePos(NAME,age,pos); 执行后效果

MySQL建立索引的注意事项

大家都知道对数据库表字段建立索引可以有效的提升数据的查询效率&#xff0c;但索引也不是随便建立的&#xff0c;需要我们对建立索引的规范有一定的了解&#xff0c;才能更好的发挥出索引的优势&#xff0c;避免因为滥建索引反而带来整体性能的下降。 1、哪些列上建立索引&am…

MySQL之创建索引

文章目录 MySQL之创建索引1.五种索引分类2.创建表后创建索引命令(create)3.创建表后创建索引命令(alter)3.1单列主键索引3.2单列唯一索引3.3组合唯一索引3.4单列普通索引3.5组合普通索引3.6单列全文索引 4.创建表时创建索引命令(create)4.1单列主键索引(不起名)4.2组合普通索引…

MySQL几种创建索引的方式

一、创建表时创建索引 key 索引名 &#xff08;column&#xff09;&#xff1b; 二、表创建好后创建索引 1、通过Alter创建索引 ①PRIMARY KEY&#xff08;主键索引&#xff09; mysql > ALTER TABLE table_name ADD PRIMARY KEY ( column ) ②UNIQUE(唯…

Mysql 创建索引

数据库建立索引常用的规则如下&#xff1a; 1、表的主键、外键必须有索引&#xff1b; 2、数据量超过300的表应该有索引&#xff1b; 3、经常与其他表进行连接的表&#xff0c;在连接字段上应该建立索引&#xff1b; 4、经常出现在Where子句中的字段&#xff0c;特别是大表的…

mysql 创建索引的三种方式

1、使用CREATE INDEX创建&#xff0c;语法如下&#xff1a; CREATE INDEX indexName ON tableName (columnName(length)); 2、使用ALTER语句创建&#xff0c;语法如下&#xff1a; ALTER TABLE tableName ADD INDEX indexName(columnName); ALTER语句创建索引&#xff0c;下面提…

前端的rem的用法

1.概念 首先来说说rem的概念&#xff0c;rem就是根元素的字体大小单位。 2.简单讲讲rem的概念 <html><head><meta charset"utf-8"><style type"text/css">html {font-size: 30px;}.div1 {font-size: 1rem;}.div2{font-size: 30…

前端预览pdf文件流

场景是前端需要实现预览各种文件的功能&#xff0c;又要保证安全&#xff0c;所以采用了文件后端转换成pdf文件流前端预览的方式进行预览&#xff0c;经过一段时间查找帖子&#xff0c;记录一下遇到最大的坑 网上帖子很多&#xff0c;试了之后一直没有实现&#xff0c;究其根源…

前端实现文件下载的方法

前端实现文件下载 前端下载一般分为两种情况&#xff0c;一种是后端直接给一个文件地址&#xff0c;通过浏览器打开就可以下载&#xff0c;另外一种则需要发送请求&#xff0c;后端返回二进制流数据&#xff0c;前端解析流数据&#xff0c;生成URL&#xff0c;实现下载。 一、…

前端项目部署到服务器

1.准备工具 服务器&#xff1a;阿里云 腾讯云 华为云都可以 我这里使用的是阿里云ECS共享型(推荐) xshell&#xff1a;用于远程连接服务器&#xff0c;修改配置文件 xftp&#xff1a;用于连接远程服务器&#xff0c;将本地资源上传到远程服务器 2.服务器设置 1.第一次需重…

微服务前端部署

四.config机器前端部署 1.在config机器上安装jdk1.8,mysql,redis,nacos,nginx安装流程我就不一一解释了,大家可自行百度,后面我会贴上必要的配置信息 2.修改前端的vue.config.js的配置 配置修改:前端ui文件中的index.js文件、vue.config.js文件 如下图: 3.修改后在前端…

前端cookie详解

cookie在前端还是比较总重要的&#xff0c;接下来将总结一下cookie知识点。 将从以下方面去聊一聊cookie。 1、什么样的数据适合放到cookie中。 2、cookie是如何设置的。 3、cookie如何进行携带传送给服务器的。 4、cookie如何实现删除的。1、什么样的数据适合存放在cookie中?…

必背前端八股文

前端八股文 看到一篇特别好的前端八股文&#xff0c;强力推荐 &#x1f525; 连八股文都不懂还指望在前端混下去么 - 掘金 (juejin.cn)https://juejin.cn/post/7016593221815910408