jvm与锁
今天是《面霸的自我修养》的第二弹,内容是Java并发编程中关于Java内存模型(Java Memory Model)和锁的基础理论相关的问题。这两块内容的八股文倒是不多,但是难度较大,接下来我们就一起一探究竟吧。
数据来源:
- 大部分来自于各机构(Java之父,Java继父,某灵,某泡,某客)以及各博主整理文档;
- 小部分来自于我以及身边朋友的实际经理,题目上会做出标识,并注明面试公司。
叠“BUFF”:
- 八股文通常出现在面试的第一二轮,是“敲门砖”,但仅仅掌握八股文并不能帮助你拿下Offer;
- 由于本人水平有限,文中难免出现错误,还请大家以批评指正为主,尽量不要喷~~
- 本文及历史文章已经完成PDF文档的制作,提取关键字【面霸的自我修养】。
难易程度:🔥🔥🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:阿里巴巴
Java内存模型篇
关于Java内存模型的内容可以说是八股文中最晦涩难懂的部分之一了, 《JSR-133 Java Memory Model and Thread Specification》中是这么介绍这部分内容的:
The discussion and development of this specification has been unusually detailed and technical, involving insights and advances in a number of academic topics.
不过还好,面试中通常不会过分深入的考察Java内存模型的部分。
🔥描述下Java内存模型,说说你对它的理解。
难易程度:🔥🔥🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:美团,爱奇艺,阿里巴巴
Java内存模型(Java Memory Model,JMM)是Java语言规范中的一套规则,它描述了多线程环境下的线程与内存(主内存和高速缓存)的交互方式,以保证可见性,有序性和原子性,同时它屏蔽了硬件与操作系统的底层差异,使得Java程序在所有平台下的内存访问效果一致。
高速缓存带来的可见性问题
我们知道,CPU的运算速度是远高于内存读写速度的,为了减少速度间的差异,CPU为每个核心引入了高速缓存(通常分为L1,L2和L3)。多线程的程序中,线程可能会运行在不同的核心上,这时它们使用自己缓存中从主内存拷贝的数据副本,假设每个CPU只有一个高速缓存,画一个简易的模型:
如果线程T1和线程T2分别从主内存中读取同一个数据的到自己的高速缓存中进行操作,如果线程T1是先于线程T2发生的,那么此时线程T2无法感知到线程T1对缓存中数据做出的修改,导致可线程间的可见性问题。
Tips:虽然硬件层面引入了缓存一致性协议,但仍旧存在可见性问题,另外不同的CPU架构对缓存一致性协议的实现不同导致出现的问题也不相同,这部分内容大家可以自行探索。
上下文切换带来的原子性问题
Java中常常会使用count++
的方式来实现计数器的自增操作,直觉上我们认为该操作是“一气呵成”的,但实际上对应的计算机中执行了3条指令:
- 指令1:将count读入缓存;
- 指令2:执行自增操作;
- 指令3:将自增后的count写入内存。
如果运行在同一个核心上的线程T1和线程T2先后执行count++
,可能会存在一种情况:
初始状态下count为0,我们期望执行结束后线程T1的执行结果是1,线程T2的执行结果是2,但实际上恰恰相反,这就是上下文切换带来的原子性问题。
Tips:上下文切换的内容请参考《面霸的自我修养:Java线程专题》。
指令重排带来的有序性问题
指令重排是CPU一项重要的优化手段,在不改变单线程执行结果的前提下,CPU可以自行选择如何优化指令。指令重排遵循两个基本原则:
- 数据依赖原则:如果两个操作使用的数据存在依赖性,那么不能通过指令重排来优化这两个操作的执行顺序;
- as-if-serial语义:无论如何重排序,都要保证单线程场景下的语义不能被改变(或者说执行结果不变)。
我们举个Java中经典的例子,未正确同步的单例模式:
public static class Singleton {private Singleton instance;public Singleton getInstance() {if (instance == null) {synchronized(this) {if (instance == null) {instance = new Singleton();}}}return instance;}private Singleton() {}
}
Java中通过关键字new来创建一个对象要经历3步:
- 为这个对象分配内存;
- 初始化这块内存;
- 将变量名指向这块内存。
分析数据依赖原则,操作1是要先于操作2和操作3执行的,操作2和操作3之间并没有依赖性,如果操作2和操作3交换了执行顺序,依旧满足单线程环境下的语义,因此,在实际的执行过程中,无论是1->2->3还是1->3->2都是可以接受的。
那么在这个例子中,可能出现如下情况:
这种情况下线程T2拿到的是未经过初始化的instance对象。
JMM的理解
JMM提供了一系列Java内存交互规范,用于规范不同平台下多线程环境中并发访问共享内存的方式,以保证可见性,原子性和有序性,确保程序的可预测性和可靠性。JMM中最重要的两个部分是as-if-serial语义和Happens-Before原则。
Tips:实际上,JMM的出现是早于JSR-133的,在早期的Java语言规范中描述的JMM模型存在一定的缺陷,因此在JSR-133中对早期的JMM模型做了改进,并作为JSR-176(Java 5.0)的一部分。
Happens-Before原则
难易程度:🔥🔥🔥🔥🔥
重要程度:🔥🔥🔥
公司:美团,爱奇艺,阿里巴巴
Happens-Before原则是JMM中的一部分,用于描述多线程环境下操作之间执行结果的顺序,例如:操作A happens-before操作B(记作
),表示无论在何种情况下,操作A的结果对操作B来说都是可见的。
JSR-133中定义了Happens-Before原则的6项内容:
- 程序顺序规则:线程中的每个操作happens-before该线程中的任意后续操作。
- 监视器锁规则:锁的解锁happens-before随后这个锁的加锁。
- volatile变量规则:volatile变量的写happens-before后续任意对这个volatile变量的读。
- 传递性:如果
,且,那么。 Thread#start
规则:如果线程t1执行操作启动线程t2(执行t2.start),那么t1线程的t2.start
操作happens-before于线程t2中的任意操作。Thread#join
规则:如果线程t1执行操作t2.join
并成功返回,那么线程B中的任意操作happens-before于线程A从t2.join
操作成功返回。
Happens-Before原则提供了线程间的可见性保证,描述了线程执行结果间的先后顺序,但Happens-Before原则并不限制指令执行的顺序,即Happens-Before原则并不禁止重排序,只是要求重排序后的结果满足Happens-Before原则的要求。
锁的理论篇
这部分我们来讨论在设计锁的过程中的理论基础,了解各种各样的锁的特性。
Tips:《一文看懂并发编程中的锁》中涵盖了大部分Java中锁的理论知识。
什么是读(共享)锁?什么是写(独占/互斥/排他)锁?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥
公司:无
读写锁之间是对访问共享资源“态度”上的差异。
读锁(Read Lock)
读锁(Read Lock),共享锁(Shared Lock),S锁,指的是允许多个线程同时读取共享资源的并发控制机制,读锁在读操作之间是共享的,一旦涉及到写操作就会发生互斥。
写锁(Write Lock)
写锁(Write Lock),互斥锁(Mutex Lock),排他锁(Mutex Lock),X锁,指的是无论读写同一时间只允许一个线程访问共享资源的并发控制机制。
Tips:在并发编程中,你会常常看到临界区这个词,临界区指的是访问共享资源的代码区域,如果不能正确的控制这段代码区域的并发访问,可能会导致很多违背直觉的并发问题。
🔥什么是乐观锁?什么是悲观锁?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:蚂蚁金服,联储证券,质数金融
悲观锁(Pessimistic Locking)
悲观锁是一种用于多线程环境中保护共享资源一致性的并发控制机制。悲观锁总是假设共享资源会被修改,因此在访问(包含读和写两种)共享资源前,先获取锁来保护共享资源,防止其它线程访问共享资源,避免了并发导致的问题。
悲观锁的工作原理如下:
- 线程尝试获取保护共享资源的锁;
-
- 获取锁成功,允许线程访问共享资源;
- 获取锁失败,线程阻塞,等待锁的释放;
- 获取到锁的线程操作完毕后释放锁。
乐观锁(Optimistic Locking)
同样的,乐观锁也是一种用于多线程环境中保护共享资源一致性的并发控制机制。与悲观锁不同,乐观锁认为共享资源不会被修改,所以在读取时并不会对资源进行上锁,只有在更新资源时,才会对资源进行冲突检测。
乐观锁的工作原理如下:
- 允许多线程同时读取共享资源;
- 写入共享资源时通过自身持有资源的标识(版本号,时间戳等)与共享资源的标识进行对比;
-
- 标识未发生改变,允许线程写入资源;
- 标识发生改变,禁止线程陷入资源;
- 写入资源失败的的线程,允许进行重试或直接抛出异常。
Tips:这里我们略过了通过共享资源的值比较环节,直接使用了版本号或时间戳。
🔥乐观锁一定优于悲观锁吗?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:蚂蚁金服,联储证券,质数金融
乐观锁与悲观锁适用的场景并不相同,无法绝对的说孰优孰劣。乐观锁更适用于读多写少的场景,而悲观锁更适用于写多读少的场景。
乐观锁
乐观锁的特点是假设冲突不会发生,读取共享资源时不会加锁,允许对多线程同时读取共享资源,只在更新数据时检测冲突。
优点:
- 允许多线程同时访问共享资源,不会加锁,性能较好
- 不会引起死锁
缺点:
- 写多读少的场景中,频繁的重试会带来额外的性能开销
悲观锁
悲观锁的特点是假设冲突总会发生,无论读写操作,都会加锁,同一时间只允许一个线程访问共享资源。
优点:
- 只允许一个线程访问共享资源,避免了乐观锁在多线程写入时频繁重试带来的性能消耗
缺点:
- 无论读写都会加锁,实际上相当于单线程访问共享资源,会成为高并发系统的性能瓶颈
- 如果业务中存在多个锁,可能会导致死锁的发生
什么是CAS?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:无
CAS(Compare And Swap),即比较替换。CAS操作3个数:
- 内存值V,即内存中共享资源的值;
- 旧的预期值A,即线程从内存中读取到且未进行修改共享资源的值;
- 要修改的值B,即线程进行修改后的共享资源的值。
只有当V == A
时,才会将V的值更新为B,否则什么都不做。
其原理是,如果内存中值与线程取出的值相同时,认为在这个期间并没有线程修改共享资源,因此可以对共享数据进行修改。但如果某个线程先将共享资源从V修改到W,再将共享资源从W修改会回V,此时就导致了ABA问题。
🔥乐观锁如何解决ABA问题?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:蚂蚁金服
ABA问题是并发编程中的经典问题,通常在使用CAS时会产生ABA问题:
- 假设存在共享资源A;
- 线程T1读取A;
- 线程T2读取A后,将其修改为B,并写入内存;
- 线程T3读取B后,将其修改为A,并写入内存;
- 线程T1将A修改为C,并通过CAS将C写入内存。
看起来线程T1的修改路径是从A->C,实际上是从A->B->A->C。
为了解决ABA的问题,可以通过为共享资源添加版本号(或时间戳),写入操作时比较线程获取到共享资源的版本号与内存中共享资源的版本号是否一致,如果一致则允许更新共享资源,同时需要更新共享资源的版本号,否则不允许更新。
🔥什么是公平锁?什么是非公平锁?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:美团
公平锁与非公平锁的区别在于获取锁的顺序上。公平锁按照线程申请锁的顺序,依次排队获取锁;非公平锁则不考虑申请顺序,当锁处于空闲状态时,线程可以直接“抢夺”锁的使用权。
公平锁按照申请顺序获取锁的使用权,正常情况下每个线程都能在可预期的时间内获取到锁;非公平锁可能会出现虽然线程申请锁的时间非常早,但始终无法抢占到锁,导致线程饥饿。
非公平锁的优点在于无需维护等待队列,在加锁和解锁的速度上优于公平锁。
Tips:在简单的非公平锁实现中,抢占锁失败的线程调用Object#wait
进入阻塞状态;释放锁后,调用Object#notifyAll
唤醒所有线程继续抢夺,无需引入等待队列。
🔥什么是可重入锁?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:蚂蚁金服,美团
可重入锁,POSIX标准中称为递归锁,指的是允许统一个线程多次获取同一个锁。可重入锁可以解决递归调用或嵌套调用中的死锁问题,例如:递归的方式删除指定路径下的所有文件:
private static void deleteFile(File directory) {synchronized (LOCK) {File[] files = directory.listFiles();for (File subFile : files) {if(subFile.isDirectory()) {deleteFile(subFile);} else {subFile.delete();}}}
}
如果synchronized不具备可重入性,那么在遇到第一个子文件夹时程序会被阻塞,导致程序无法继续进行。
可重入锁的设计中,通常会在内部维护一个计数器,每次进入可重入锁时计数器加1,退出时计数器减1,进入和退出的次数需要匹配。
Java中提供了哪些锁?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥
公司:无
Java中有3个常见的锁,分别是synchronized,ReentrantLock,ReentrantReadWriteLock,以及一个“小众的的StampedLock。
特点 | synchronized | ReentrantLock | ReentrantReadWriteLock | StampedLock |
公平锁 | 非公平锁 | 公平模式/非公平模式 | 公平模式/非公平模式 | 非公平锁 |
可重入性 | 可重入 | 可重入 | 可重入 | 可重入 |
乐观锁 | 悲观锁 | 悲观锁 | 悲观锁 | 乐观锁 |
互斥锁 | 是 | 是 | ReadLock 共享/WriteLock 互斥 | ReadLock 共享/WriteLock 互斥 |
🔥如果让你实现锁,你有什么思路?
难易程度:🔥🔥🔥
重要程度:🔥🔥🔥🔥🔥
公司:蚂蚁金服,美团
首先考虑使用场景,读多写少可以选择读写锁(读共享,写互斥),写多读少可以直接选择互斥锁;其次添加特性,如果需要支持递归加锁或嵌套加锁就需要添加可重入性,选择公平性或非公平性,最后还可以考虑加锁失败时的设计,如果锁定的临界区非常“小”,锁会在极短时间内释放,可以考虑使用自旋,否则可以选择阻塞。
抛砖引玉,我这里使用AQS完成了一个非公平,不可重入的互斥锁:
public class MutexLock {public void lock() {sync.acquire(1);}public void unlock() {sync.release(0);}private final Sync sync = new Sync();static class Sync extends AbstractQueuedSynchronizer {@Overrideprotected boolean tryAcquire(int arg) {Thread currentThread = Thread.currentThread();if (compareAndSetState(0, arg)) {setExclusiveOwnerThread(currentThread);return true;} else {return false;}}@Overrideprotected boolean tryRelease(int arg) {if (getState() != 1) {return false;}setState(arg);setExclusiveOwnerThread(null);return true;}}
}
Tips:AQS的问题我们后面再讨论。
参考
- JSR-133: Java Memory Model and Thread Specification
- JSR 133 (Java Memory Model) FAQ
- 深入理解Java内存模型
- 深入理解JMM和Happens-Before
- 一文看懂并发编程中的锁
如果本文对你有帮助的话,还请多多点赞支持。如果文章中出现任何错误,还请批评指正。最后欢迎大家关注分享硬核Java技术的金融摸鱼侠王有志,我们下次再见!
相关文章:

jvm与锁
今天是《面霸的自我修养》的第二弹,内容是Java并发编程中关于Java内存模型(Java Memory Model)和锁的基础理论相关的问题。这两块内容的八股文倒是不多,但是难度较大,接下来我们就一起一探究竟吧。 数据来源ÿ…...

零基础安装pycuda
零基础安装pycuda 前言安装Visual Studio安装C/C环境添加环境变量 安装pycuda查看系统位数查看python版本下载whl文件 前言 最近开始学习基于python的cuda编程,记录一下pycuda的安装。 在安装pycuda之前,首先需要有NVIDIA的独立显卡并且要安装CUDA和CUD…...

Streamlit 讲解专栏(十一):数据可视化-图表绘制详解(中)
文章目录 1 前言2 绘制交互式散点图3 定制图表主题4 增强数据可视化的交互性与注释步骤1步骤二 5 结语 1 前言 在上一篇博文《 Streamlit 讲解专栏(十):数据可视化-图表绘制详解(上)》中,我们学习了一些关…...

d3dx9_35.dll丢失怎么解决
今天,我将为大家介绍关于电脑d3dx9_35.dll丢失的4种详细修复方法。希望通过这次分享,能够帮助大家解决在日常工作和生活中遇到的一些问题。 首先,让我们来了解一下d3dx9_35.dll是什么? d3dx9_35.dll是一个非常重要的动态链接库文…...

Ansible自动化运维工具(二)
目录 (6)copy模块 (7)file模块 编辑编辑(8)hostname模块 (9)ping模块 (10)yum 模块 (11)service/system模块 编辑 …...

uniapp中使用原生canvas标签绘制视频帧来模拟拍照,拍照后将图绘制在另外一个canvas上编辑画图,这样反复操作
uniapp中使用原生canvas标签绘制视频帧来模拟拍照,拍照后将图绘制在另外一个canvas上编辑画图,这样反复操作会导致ios系统上白屏,canvas2d上下文为null,经查阅找到相关资料 IOS 创建Canvas过多导致getContext(‘2d’) 返回null 总 Canvas 内存…...

机器视觉工程师们,学习是工作以外的事情
面试时,领导问你,很多技术问题,你永远的回答是,我可以学。 公司以为你来公司的目标就是学习,学完就跑。 那你进公司的目标到底是什么? 我认为你,你最好想好再回答。 对于每一家公司来说…...

数据驱动的生活:探索未来七天生活指数API的应用
前言 随着科技的不断发展,数据已经成为我们生活中不可或缺的一部分。从社交媒体上的点赞和分享,到电子邮件和搜索引擎的历史记录,数据正在以前所未有的速度积累。而这些数据的利用不仅仅停留在社交媒体或商业领域,它们还可以为我…...

【数据分享】2006-2021年我国城市级别的集中供热相关指标(免费获取\20多项指标)
《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标、2006-2021年我国城市级别的各类建设用地面积数…...

2022年研究生数学建模竞赛优秀论文汇总
A题:移动场景超分辨定位问题 参考代码论文1 论文2 论文3 论文4 论文5 论文6 论文7B题: 方形件排样优化与订单组批问题探析 参考代码论文1 论文2 论文3 论文4 论文5 论文6 论文7C题: 汽车制造涂装-总装缓存调序区调度优化问题论文1 论文2 论文…...

阿里云申请免费SSL证书的两种验证方式及配置服务器Tomcat升级HTTPS协议
通用教程,其他服务商的免费 SSL 证书也差不多是这个流程。(至少腾讯云的操作步骤和本文是一致,嘻嘻!) 申请 SSL 证书 首先在阿里云上创建并申请 SSL 证书,之后选择 DNS 验证的方式,一种是手动配…...

SQL Server 和 MySql 语法和关键字的区别
SQL Server 和 MySql 语法和关键字的区别 ——用于SQLServer到MySql的转换 mysql的ifnull()函数对应sql的isnull()函数;mysql的存储过程中变量的定义去掉;mysql的每句结束要用";"SQLServer存储过程的AS在MySql中需要用begin .....end替换字符串连接用concat()函数;…...

2023_Spark_实验三:基于IDEA开发Scala例子
一、创建一个空项目,作为整个项目的基本框架 二、创建SparkStudy模块,用于学习基本的Spark基础 三、创建项目结构 1、在SparkStudy模块下的pom.xml文件中加入对应的依赖,并等待依赖包下载完毕。 在pom.xml文件中加入对应的依赖 <!-- S…...

2023年高教社杯数学建模思路 - 案例:异常检测
文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…...

C# Dapper 操作Oracle数据库
nuget安装内容 1.配置连接字符串 OracleConnectionString这个可用 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","…...

element侧边栏子路由点击不高亮问题
最近自己封装侧边栏 又碰到了点击子路由不高亮的问题 <template><div class"aside"><el-scrollbar :vertical"true" class"scrollbar_left_nav"><el-menu :default-active"defaultActive" :collapse"$stor…...

C# 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
C# 在调用Cdll时,可能会出现 :试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)这个错误。 一般情况下是C#目标平台跟Cdll不兼容,64位跟32位兼容性问题, a.客户端调用Cdll报的错则, 1)允许的话把C#客户端…...

Linux 进程的睡眠和唤醒详解
概要 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运…...

AI 绘画Stable Diffusion 研究(十五)SD Embedding详解
大家好,我是风雨无阻。 本期内容: Embedding是什么?Embedding有什么作用?Embedding如何下载安装?如何使用Embedding? 大家还记得 AI 绘画Stable Diffusion 研究(七) 一文读懂 Stab…...

在Jupyter Notebook中添加Anaconda环境(内核)
在使用前我们先要搞清楚一些事: 我们在安装anaconda的时候它就内置了Jupyter Notebook,这个jupyter初始只有base一个内核(显示为Python3) 此后其实我们就不需要重复安装完整的jupyter notebook了,只要按需为其添加新的…...

适配器模式简介
概念: 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作。 特点: 通过适配器,可以使原本因为接口不匹配而无法…...

MyBatis —— 多种查询及映射关系
前言 上一篇文章中荔枝梳理了有关MyBatis的相关环境配置和核心配置文件及其模板的设置和生成,而在这篇文章中荔枝会着重梳理MyBatis多种查询情况、特殊SQL执行以及两表联查时映射关系的处理。希望对需要的小伙伴有帮助~~~ 文章目录 前言 一、多种查询情况 1.1 查…...

腾讯云服务器镜像TencentOS Server操作系统详细介绍
腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统,完全兼容CentOS生态和操作方式,TencentOS Server操作系统为云上运行的应用程序提供稳定、安全和高性能的执行环境,TencentOS可以运行在腾讯云CVM全规格实例上,包括黑石物理…...

Docker 中下载各版本的 CentOS、CentOS Steam 方式
如果你跟我一样,想要在docker下载centos的镜像,但是无奈访问不了 https://hub.docker.com/,于是不知道有哪些tag可以下载,该如何办呢? 方法如下,以供参考。 访问:https://quay.io/repository/…...

多线程使用HashMap,HashMap和HashTable和ConcurrentHashMap区别(面试题常考),硬盘IO,顺便回顾volatile
一、回顾💛 谈谈volatile关键字用法 volatile能够保证内存可见性,会强制从主内存中读取数据,此时如果其他线程修改被volatile修饰的变量,可以第一时间读取到最新的值。 二、💙 HashMap线程不安全没有锁,HashTable线程…...

专线连接交换机设置 – 如何实现高效率的网络连接?
专线链接交换机设置 – 如何实现高效率的网络连接? 什么是专线连接交换机? 在现代互联网中,网络连接的快速和高效是至关重要的。尤其是对于需要大量数据传输和保证网络稳定性的企业和组织来说,专线连接交换机是一项非常重要的技…...

C#,数值计算——Midexp的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Midexp : Midpnt { public new double func(double x) { return funk.funk(-Math.Log(x)) / x; } public Midexp(UniVarRealValueFun funcc, double aa, d…...

微信小程序使用本地存储方法wx.setStorageSync()和wx.getStorageSync()
微信小程序的本地存储可以使用wx.setStorageSync()和wx.getStorageSync()方法实现 使用wx.setStorageSync()方法可以将数据以键值对的方式存储到本地存储中: wx.setStorageSync(demo, demo123);获取数据:使用wx.getStorageSync()方法可以从本地存储中获…...

题解:ABC317C - Remembering the Days
题解:ABC317C - Remembering the Days 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:B。 思维难度:B。 调码难度:C。 综合评价:普及-。 算法 深度优先搜索。 思路 先建图&#x…...

【CSS】简记CSS效果:通过transition(动画过渡属性)实现侧边栏目滑入滑出
需求 在资金明细的页面中,点击按钮时筛选区域从左侧滑出,完成筛选点击确认后调用接口完成数据查询,筛选区域滑入左侧; 基于微信小程序页面实现 wxml代码 <view><!-- 操作按钮 --><button type"primary&qu…...