电商网站模版wordpress sora 下载

diannao/2026/1/21 18:16:46/文章来源:
电商网站模版,wordpress sora 下载,化肥网站模板,二手房出售信息在 Java 的高并发中#xff0c;对于线程并发问题的分析通常可以通过 2 个主核心进行分析 JMM 抽象内存模型和 Happens-Before 规则三大特性: 原子性, 有序性和可见性 JMM 抽象内存模型和 Happens-Before 规则, 前面我们讨论过了。这里讨论一下三大特性。 1 原子性 定义: 一个…在 Java 的高并发中对于线程并发问题的分析通常可以通过 2 个主核心进行分析 JMM 抽象内存模型和 Happens-Before 规则三大特性: 原子性, 有序性和可见性 JMM 抽象内存模型和 Happens-Before 规则, 前面我们讨论过了。这里讨论一下三大特性。 1 原子性 定义: 一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断要么就都不执行。 简单地说就是一个操作被定义为原子性了, 那么不管这个操作里面包含多少个步骤, 他们都是一个整体的, 这个整体只有执行成功, 或不执行, 不存在任何的中间态, 比如只执行一半, 或者一半成功, 一半失败。 而回到 Java 中, 很多操作看起来就一个操作, 好像是具备原子性, 但是实际中却不具备原子性。 猜猜下面的操作哪些是原子操作? // 1 int a 1;// 2 a;// 3 int b a 1;// 4 a a 1;答案是: 只有第一个。 a 操作可以拆分为下面 3 步 读取 a 的值a 的值加 1将计算后的值重新赋值给 a 其他 2 个的分析类似。 1.1 原子操作 在 Java 内存模型中定义了 8 种原子操作 操作作用对象说明lock (锁定)主内存中的变量把一个变量标识为一个线程独占的状态unlock (解锁)主内存中的变量把一个处于锁定状态的变量释放出来释放后的变量才可以被其他线程锁定read (读取)主内存的变量把一个变量的值从主内存传输到线程的工作内存中以便后面的 load 动作使用load (载入)工作内存中的变量把 read 操作从主内存中得到的变量值放入工作内存中的变量副本use (使用)工作内存中的变量把工作内存中一个变量的值传递给执行引擎每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作assign (赋值)工作内存中的变量把一个从执行引擎接收到的值赋给工作内存的变量每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作store (存储)工作内存的变量把工作内存中一个变量的值传送给主内存中以便随后的write操作使用write (操作)主内存的变量把 store 操作从工作内存中得到的变量的值放入主内存的变量中 上面的这些指令操作是相当底层的可以作为扩展知识面掌握下。 需要注意的一点就是: 指令与指令之间组合起来达到某个效果。 但是 Java 内存模型只要求这些组合指令之间是顺序执行的不强制他们一定是连续执行的。 比如把一个变量从主内存中复制到工作内存中就需要执行 read, load 操作将工作内存同步到主内存中就需要执行 store, write 操作。 也就是说 read 和 load 之间可以插入其他指令store 和 writer 可以插入其他指令。 比如对主内存中的 a, b 进行访问就可以出现这样的操作顺序: read a, read b, load b, load a。 支持变量操作的原子操作的有 read, load, use, assign, store, write。 基础数据类型比较简单, 基本只有使用到其中的一条, 所以可以看为基本数据类型的访问读写具备原子性 (long 和 double 的操作不具备操作性), 如上面的 int a 1; 1.2 synchronized 和 volatile 对原子性的支持 synchronized 上面一共有八条原子操作其中六条可以满足基本数据类型的访问读写具备原子性还剩下 lock 和 unlock 两条原子操作。这 2 个可以用于支持更大范围的原子性操作。 尽管 JVM 没有把 lock 和 unlock 开放给我们使用但 JVM 以更高层次的指令 monitorenter 和 monitorexit 指令开放给我们使用, 映射到 Java 代码中就是— synchronized 关键字, 也就是说 synchronized 满足原子性。 public void test() {int b 0;synchronized(Test.class) {int a 1;b a;} }volatile 而说到关键字, Java 中另一个和并发相关的高频关键字 volatile, 是否可以保证原子性了。 先举一个例子。 public class VolatileExample {private static volatile int counter 0;public static void main(String[] args) {// 启动 10 个线程for (int i 0; i 10; i) {Thread thread new Thread(new Runnable() {Overridepublic void run() {for (int i 0; i 10000; i)counter;}});thread.start();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(counter);} }如上: counter 是 volatile 修饰的。 开启 10 个线程每个线程都自加 10000 次如果不出现线程安全的问题最终的结果应该就是10 * 10000 100000。 但是运行多次都是小于 100000 的结果, 也就是说明: volatile 不能保证原子性。 从上面的说明可以知道 counter 不是原子性操作。如果线程 A 读取 counter 到工作内存后其他线程对这个值已经做了自增操作后那么线程 A 的这个值自然而然就是一个过期的值因此总结果必然会是小于 100000 的。 如果让 volatile 保证原子性必须符合以下两条规则 运算结果并不依赖于变量的当前值或者能够确保只有一个线程修改变量的值变量不需要与其他的状态变量共同参与不变约束 (volatile 变量的变化不会与其它变量的变化有任何联系) 2 有序性 定义: 程序执行的顺序按照代码的先后顺序执行。 例如: int i 0; boolean flag false; i 1; // 语句1 flag true; // 语句2先给变量 i 赋值然后给 flag 赋值语句 1 在 语句 2 的前面。 但是在编译器和处理器可能会为了性能对其进行重排序 (指令重排序), 因为语句 1 和 语句 2 之间没有依赖关系所以语句 2 可能被重排序到语句 1 的前面。 2.1 synchronized 和 volatile 对有序性的支持 synchronized synchronized 语义表示锁在同一时刻只能由一个线程进行获取当锁被占用后其他线程只能等待。 因此, synchronized 语义就要求线程在访问读写共享变量时只能 “串行” 执行, 因此 synchronized 具有有序性。 但是在 synchronized 内部的代码块的逻辑, JVM 没有禁止重排序, 也就是支持处理器为了性能, 在不影响结果的情况下, 调整执行顺序。 例子: public void test() {int b 0;synchronized(Test.class) {int a 1;// 1b a;// 2int c a;} }上面 1,2 2 个操作没有存在结果的依赖, 如果为了性能, 处理器仍然可以对他们进行重排序, 变为 2, 1 的执行顺序。 volatile 在 Java 内存模型中说过为了性能优化编译器和处理器会进行指令重排序。 也就是说 Java 程序天然的有序性可以总结为如果在本线程内观察所有的操作都是有序的, 如果在一个线程观察另一个线程所有的操作都是无序的。那么 volatile 具备有序性吗? 先看一个例子volatile 和 双重检验锁定的方式Double-checked Locking的关系: public class Singleton {private volatile static Singleton instance;private Singleton() { }public Singleton getInstance(){if(instance null){synchronized (Singleton.class){if(instance null){instance new Singleton();}}}return instance;} }这里的 instance 为什么要加 volatile 修饰 创建一个对象实际是经过 3 步实现的 分配对象内存空间初始化对象将对象指向我们刚刚分配的内存 但是不加 volatile 在重排序的作用下, 可能会出现下面的执行顺序 如果 2 和 3 进行了重排序的话线程 B 进行判断 if( instance null) 时就会为 true而实际上这个 instance 并没有初始化成功显而易见对线程 B 来说之后的操作就会是错的。 而用 volatile 修饰的话可以禁止 2 和 3 操作重排序从而避免这种情况。volatile 包含禁止指令重排序的语义, 其具有有序性。 3 可见性 当多个线程访问同一个变量时一个线程修改了这个变量的值其他线程能够立即看得到修改的值 // 线程 1 执行的代码 int i 0; i 10;// 线程 2 执行的代码 j i;假若执行线程 1 的是 CPU1执行线程 2 的是 CPU2。由上面的分析可知: 当线程 1 执行 i 10 这句时会先把 i 的初始值加载到 CPU1 的本地缓存然后赋值为 10那么在 CPU1 的本地缓存中把 i 的值变为 10却没有立即写入到主存当中。 此时线程 2 执行 j i它会先去主存读取 i 的值并加载到 CPU2 的本地缓存当中此时内存当中 i 的值还是 0那么就会使得 j 的值为 0而不是 10。 这就是可见性问题线程 1 对变量 i 修改了之后线程 2 没有立即看到线程 1 修改的值。 3.1 synchronized 和 volatile 对有序性的支持 synchronized 通过对 synchronized 的内存语义进行了分析当线程获取锁时会从主内存中获取共享变量的最新值释放锁的时候会将共享变量同步到主内存中。所以 synchronized 具有可见性 (Happens-Before 的 Monitor 规则保证)。 volatile volatile 修饰的变量在写的时候底层会在后面在添加 lock 指令确保将修改的值刷新到主内存所以 volatile 具备可见性。 4 总结 synchronized 具有: 原子性, 有序性, 可见性。 volatile 具有有序性可见性。 synchronized 是否保证有序性呢? 从上面的双重检测看起来, synchronized 貌似不保证有序性, 但是 synchronized 还是保证有序性的, 只是和 volatile 的有序性不一样。 volatile 关键字禁止 JVM 编译器和处理器对其进行重排序, 而 synchronized 保证的有序性是只有单线程可以获取锁, 串行地执行同步代码的结果, 但是同步代码里的语句是会发生指令重排序。 进入 synchronized 代码块前, 底层先添加一个 acquire barrier, 在最后添加一个 release barrier, 保证同步代码块中的代码不能和同步代码块外面的代码进行指令重排, 在其内部还是会发生指令重排但基本不会影响结果。 public void testSynchronized() {// 1int a 1;// 2synchronized(TestDemo.class) {// 2.1a 2;// 2.2int b 3;// 2.3int c 4;}// 3a 3; }将 synchronized 内的代码块看着整个整体, 在 synchronized 的作用下, 1, 2, 3 是有序的, 但是 synchronized 不保证代码块内的代码是有序的, 在没有数据依赖的条件下, 运行指令重排序, 也就是可能存在 2.1 - 2.3 - 2.2 等情况。 5 参考 三大性质总结原子性、可见性以及有序性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设质量体系审核指导网站建设的域名注册

1.(Window:)cmd下输入set ORACLE_SID你想进入的数据库的那个sid(Linux:)切换到oracle用户:export ORACLE_SID你想进入的数据库的那个sid2.输入 sqlplus /nolog3.将数据库启动到RESTRICTED模式下做字符集更改:SQL> conn /as sy…

河南平台网站建设公司wordpress登录加验证码

不久前遇到一段代码使用了basename,我文件名是中文的,每次返回都只有后缀。后来发现basename函数有猫腻,不支持中文文件名,但凡有以中文开头的文件名将被忽略了。函数说明/*** 从路径中返回文件名* param string $path* 在Windows…

网站代运营做哪些淮北建筑大学

Doris 数据分布—Bucket(Tablet) 分桶的意义在于极大减少了数据的扫描范围、提高了查询的效率* 在 Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行。各个 Tablet 之间的数据没有交集,并且在物理上是独立存…

wap手机网站源码深圳网站建设服务哪家专业

一刷~ 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 有几个用例超时,容我三思…

网站建设品牌排行榜域名买卖网站

目录 前言1. 问题所示2. 原理分析2.1 forward函数理解2.2 forward函数用法 前言 深入深度学习框架的代码,发现forward函数没有被显示调用 但代码确重写了forward函数,于是好奇是不是python的魔术方法作用 1. 问题所示 代码如下所示: cla…

做疏通什么网站推广好建设网站外贸

一、逻辑回归 应用场景:解决二分类问题 1、sigmoid函数 1. 公式: 2. 作用:把 (-∞,∞) 映射到 (0, 1) 3. 数学性质:单调递增函数,拐点在x0,y0.5的位置 4. 导函数公式:f…

网站开发计划书范文网站建设优化服务熊掌号

【未来的你,会感谢今天努力的你】每日两题,一难一易,每天进步一点点,可能会直接导致一场面试的成功,或工作的轻松搞定,从而升职加薪迎娶白富美,加油小伙伴! 🍅举办场地&a…

厦门外贸企业网站建设卡密网站怎么做

如果你不懂Java 并且想认真学习接触了解一下Java的语法,建议把这篇文章收藏了,多看几遍,应该可以初步掌握Java 大部分基础的语法 。 让我们出发吧!ps:本文有点长,耐心阅读 。〇,编程环境工程项目推荐使用ID…

网站开发未按合同约定开发时间完工网站有什么作用

本文为原创,如需转载,请注明作者和出处,谢谢!众所周之,在任何面向对象的语言中(包括Java、C#),在定义抽象类时必须使用abstract关键字。虽然这已经习已为常了,但实际上ab…

在虚拟机中如何做二级域名网站广州营销网站建设公司哪家好

从去年开始入坑Lisp,周周转转也算是基本入门了这一传说中的语言。Lisp确实是一门很开明的语法规范。lambda是基本定义形式,递归在其骨子深处,试图通过函数表达世界,的确这个世界是周而复始的,有些人愿意称为循环&#…

网站建设流程步骤为需求分析导入wordpress 演示数据

Spring MVC现在已经支持异步请求处理流程了一段时间&#xff0c;该支持内部利用了Tomcat / Jetty等容器的Servlet 3异步支持。 Spring Web Async支持 考虑一下需要花一点时间处理的服务呼叫&#xff0c;该服务呼叫具有延迟&#xff1a; public CompletableFuture<Message&…

个人单页网站模板2345影视下载官网电视剧

题目描述&#xff1a; 写一个宏&#xff0c;可以将一个整数的二进制位的奇数位和偶数位交换。 题目分析&#xff1a; 相信大家都可以想到位运算如&#xff1a;按位异或&#xff0c;按位取反以及<<和>>等操作符&#xff0c;可是想到这些又能怎么样&#xff1f;还是…

ks3c ks4c做网站百度应用商店app下载安装

目录 问题引入 解释 卷积 滤波 问题引入 卷积和滤波是很相似的&#xff0c;都是利用了卷积核进行操作 那么他们之间有什么区别呢&#xff1f; 卷积&#xff1a;会影响原图大小 滤波&#xff1a;不会影响原图大小 解释 卷积 我们用这样一段代码来看 import torch.nn as …

怎么建设自己淘宝网站北京专业做网站设计公司

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一我曾经提到过最终改行从事美缝行业的老w&#xff0c;他靠自己的“不够努力”&#xff0c;最终离开了行业。但是&#xff0c;这个世界其实有点讽刺。在沉迷于安逸小日子的老…

网站形象首页flashlinux服务器wordpress

web前端何去何从&#xff1a;探索未来之路 在数字化浪潮的推动下&#xff0c;web前端技术正经历着前所未有的变革。随着新技术的不断涌现和用户体验的持续提升&#xff0c;web前端开发者们面临着前所未有的挑战与机遇。那么&#xff0c;web前端究竟何去何从&#xff1f;本文将…

带动画的网站模板东莞做网站哪家好

【多线程】线程池Future和FutureTask 【一】Future概述【1】Future的出现原因【2】Future结构图 【二】Future详解【1】Future接口源码【2】Future的5个方法【3】ThreadPoolExecutor提供了三个方法&#xff0c;来获取返回值&#xff08;1&#xff09;submit(Runnable r)&#x…

wordpress站点优化河源建网站

Backtrader 文档学习- Broker - Position 1. 概述 在backtrader中&#xff0c;Position对象是由Strategy对象创建的&#xff0c;用于跟踪策略的持仓。 通常在策略中使用以下代码检查资产的仓位&#xff1a; position&#xff08;属性&#xff09;或 getposition(dataNone, br…

阿里云虚拟主机多网站电子商务平台加盟

MongoDB分片技术 介绍 ​ 分片&#xff08;sharding&#xff09;是MongoDB用来将大型集合分割到不同服务器上采用的方法。分片这种说法起源于关系型数据库。但是实际上非关系型数据库在分片方面相比于传统的关系型数据库更有优势。 ​ 与MySQL分库方案对比&#xff0c;MongoDB…

新能源汽车十大名牌徐州英文网站优化

\w([-.]\w)*((aa.com)|(bb.com)|(163.com)) 这个正则表达式可实现匹配含有aa.com或bb.com或163.com 的email 转载于:https://www.cnblogs.com/inbase/archive/2013/04/01/2994479.html

湖南平台网站建设企业网页制作培训上海排名前十

1、复制多行 number yy 2、光标跳转到指定行 :line 3、插入当前光标到上行 O 4、插入当前光标到下行 o