Java高并发架构之并发编程-002

Java高并发高性能分布式框架从无到有微服务架构设计 微服务架构模式(Microservice Architect Pattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具 阅读详情

多线程并发编程 并发三大要素

一、原子性

原子,一个不可再被分割的颗粒。原子性,指的是一个或多个不能再被分割的操作。

int i = 1; // 原子操作
i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到主内存。

虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为“复合操作”。

我们可以用synchronized 或 Lock 、原子变量类来把这个复合操作“变成”原子操作。

案例演示:

public class MultiThread3Factor implements Runnable {
    // Atomicity
    /*    一、原子性

    原子,一个不可再被分割的颗粒。原子性,指的是一个或多个不能再被分割的操作。

    int i = 1; // 原子操作
    i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到主内存。

    虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为“复合操作”。

    我们可以用synchronized 或 Lock 来把这个复合操作“变成”原子操作。
    */

    private int i = 0;

    private  void increase() {
        i++;
    }

    private synchronized void increase1() {
        i++;
    }


    Lock mLock = new ReentrantLock();

    private void increase2() {
        mLock.lock();
        try {
            i++;
        } finally {
            mLock.unlock();
        }
    }

    AtomicInteger mAtomicInteger = new AtomicInteger(0);

    private void increase3() {
       i = mAtomicInteger.incrementAndGet();
    }

    public static void main(String[] args) throws InterruptedException {
        MultiThread3Factor runnable = new MultiThread3Factor();
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println(runnable.i);
    }
    
    @Override
    public void run() {
        for (int i =0; i < 2000; i++) {
            increase3();
        }
    }

}

执行效果:

二、可见性

当多线程访问某一个(同一个)变量时,其中一条线程对此变量作出修改,其他线程可以立刻读取到最新修改后的变量。

 public static void main(String[] args) throws InterruptedException {

        // 线程 1 执行
        Thread n = new Thread(new Runnable() {
            @Override
            public void run() {
                i++;
            }
        });
        n.start();

        // 线程 2 执行
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.print("线程2: i=" + i);
            }
        }).start();

    }

 

即使是在执行完线程里的 i++ 后再执行线程 2,线程 2 的输入结果也会有 2 个种情况,一个是 0 和 1。

因为 i++ 在线程 1(CPU1)中做完了运算,并没有立刻更新到主内存当中,而线程 2(CPU2)就去主内存当中读取并打印,此时打印的就是 0。

synchronized和Lock能够保证可见性。

另外volatile关键字也可以解决这个问题

案例2

static boolean stop = true;
    public static void main(String[] args) throws InterruptedException {

        // 线程 1 执行
        Thread n = new Thread(new Runnable() {
            @Override
            public void run() {
                i++;
            }
        });
        n.start();

        // 线程 2 执行
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (stop){
                    i++;
                }
                System.out.print("i=" + i);
            }
        }).start();
        TimeUnit.MILLISECONDS.sleep(1000);
        System.out.println("stop 线程执行....");
        stop = false;
    }


三、有序性

我们都知道处理器为了拥有更好的运算效率,会自动优化、排序执行我们写的代码,但会确保执行结果不变。

例子:

int a = 0; // 语句 1
int b = 0; // 语句 2
i++; // 语句 3
b++; // 语句 4

这一段代码的执行顺序很有可能不是按上面的 1、2、3、4 来依次执行,因为 1 和 2 没有数据依赖,3 和 4 没有数据依赖, 2、1、4、3 这样来执行可以吗?完全没问题,处理器会自动帮我们排序。(没有数据依赖的语句可能会被优化执行顺序)

在单线程看来并没有什么问题,但在多线程则很容易出现问题。

再来个例子:

线程2需要依赖线程1初始化一些数据后才能正常执行。

// 线程 1
init();
inited = true;

// 线程 2
while(inited){
	work();
}

init(); 与 inited = true; 并没有数据的依赖,在单线程看来,如果把两句的代码调换好像也不会出现问题。

但此时处于一个多线程的环境,而处理器真的把这两句代码重新排序,那问题就出现了,若线程 1 先执行 inited = true; 此时,init() 并没有执行,线程 2 就已经开始调用 work() 方法,此时很可能造成一些奔溃或其他 BUG 的出现。

synchronized和Lock能确保原子性,能让多线程执行代码的时候依次按顺序执行,自然就具有有序性。

而volatile关键字也可以解决这个问题,volatile 关键字可以保证有序性,让处理器不会把这行代码进行优化排序。

总结

在进行多线程编程时要时刻保持线程安全的问题。主要关注这3个核心要素的处理

Java高并发架构设计:从原理到实战优化 高并发编程是现代分布式系统的核心技术挑战,其核心在于通过多线程、缓存、分布式锁等机制提升系统吞吐量。从原理层面看,JUC工具包提供了线程池、锁等基础并发原语,结合Redis等中间件可实现分布式协调。在工程实践中,分层防御架构和接口幂等性设计能有效应对秒杀等场景,而缓存策略优化可解决击穿、雪崩等问题。本文通过电商、社交等真实案例,详解线程池配置、热点key探测等工业级解决方案,并对比分析synchronized、StampedLock等并发工具的性能差异,为开发者提供可落地的性能优化方案。 阅读详情

相关推荐

时间序列分析:ARCH、GARCH、TGARCH与DCC-GARCH波动率模型(含代码)

关注TGARCH模型和DCC-GARCH的应用,通过在沪深300和中证500指数上应用TGARCH和DCC-GARCH模型,揭示这两个指数之间的条件异方差及动态相关性的变化规律。

celiaweiwei的博客 1万+

学习JAVA资源

关于 Java 社区和论坛, 有[Coderanch][1]、 [Stack Overflow][2]、 [Oracle Java 社区][3] 以及[Reddit][4]上的 Java 社区。 https://coderanch.com/forums https://stackoverflow.com/questions/tagged/java ht...

The shortest answer is doing。 263

(25.08)Ubuntu20.04+ROS1复现FAST-LIO2

请确保在。

m0_69023437的博客 3989

PHP如何打造一个高可用高性能的网站呢?

https://blog.youkuaiyun.com/jwq101666/article/details/80162245 1. 说到高可用的话要提一下redis,用过的都知道redis是一个具备数据库特征的nosql,正好弥补了PHP的瓶颈,个人认为PHP的 瓶颈在于数据库,像Apache和Nginx的高级web服务器在承受并发量上面都各有千秋,apache的最大承受并发数可以到三四千个,ng...

lxw1844912514的博客 915

cs188Inference in Bayes Nets(贝叶斯网络的推理)

cs188Inference in Bayes Nets贝叶斯网络的推理Question1(3 points):Bayes Net StructureQuestion2(1 points):Bayes Net ProbabilitiesQuestion 3(5 points):Join FactorsQuestion4(4 points):EliminateQuestion5(4 points):NormalizeQuestion 6(4 points):Variable EliminationQuesti

weixin_46582817的博客 1673

Oracle EBS MRP 模块测试记录

MRP 模块测试记录        构思:创建Shirt成品物料,它由Cloth和Button组成。1*Shirt=1*Cloth+8*Button。        首先创建这三个物料(复制模板创建),并分配给T02。        创建BOM,将这三个物料关联起来。        分别创建资源(人工和设备)制造Cloth和Button。        分别创建两个部门(HumanDep和Mach

NetSuite 张老师 8164

别再卷 Python 了!Java + LangChain4j + Redis,带你实现企业级 RAG 高并发架构

一个刚上线的 RAG 知识库问答服务,在处理一个 50 页的 PDF 文件时,直接把 Pod 干 OOM 了。白天还好好的,晚上并发一上来就拉胯,典型的并发编程“新手村”事故。我们有强大的生态、成熟的中间件、无敌的并发处理能力。把这些优势和 AI 结合起来,我们不是在追赶,而是在“降维打击”。每次问答,先去 Redis 捞相关向量,再带着上下文去请求大模型。兄弟们,别再抱着 CRUD 焦虑了。网上搜 “Java RAG”,出来的教程一大堆,90% 都在教你怎么用。,构建一个无状态、高可用的 RAG 服务。

Goaheadz的博客 980

Docker 实战:使用 Docker Desktop 在 MacOS 上安装 Docker

在这采用 Docker Desktop 在 Mac 上来安装 Docker。Docker Desktop 是 Docker 的管理桌面 IDE,提供了一个直观的GUI(图形用户界面),允许您直接在本机上管理容器、应用程序以及镜像。适用于 Mac、Linux 以及 Windows 环境,允许您构建、共享和运行容器化应用程序和微服务。Docker Desktop 可以大大降低在复杂配置上的时间,因此您可以专注于编写代码。它负责端口映射、文件系统问题和其他默认设置,并定期更新 Bug 修复和安全更新。

SmartSi 8004

干货合集 | 500 篇Java技术文章整理

今天,给大家推荐一位 Java 架构领域做得非常好的朋友:师长。师长的公众号:Java进阶架构师这3年来累积了200篇优质原创文章,及各类优质技术文章共500篇。其号内专注于 原...

公众号:Java后端 7148

GB28181 —— 1、Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台(连接带云台摄像机)

GB28181 —— Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台

5460

PyQt5开发应聘简历模版

该工具旨在帮助用户对Excel、CSV格式的数据进行快速导入、分析及可视化展示,支持折线图、柱状图、饼图等多种图表类型,提供数据筛选、排序、统计等功能,适用于企业数据分析人员日常工作。:一款用于本地文件管理的桌面应用,支持文件的新建、复制、移动、删除、重命名等基本操作,具备文件搜索、分类整理、批量操作及文件信息查看等功能,提升用户文件管理效率。:熟悉QSS(Qt Style Sheet)样式表,可对PyQt5界面进行个性化美化,包括控件颜色、字体、边框、布局等样式定制,提升应用视觉体验。

ybmzlqzj的博客 83

Scala并发编程

并发编程 在 Java 中,多线程访问共享数据的时候会存在【线程安全】问题 Scala 的多线程使用了新的通信机制 通过发送消息来通信,没有了共享数据,从而实现并发编程 Scala 使用的是 Akka 框架,Akka 通过 Actor 模式实现高并发 Akka 是使用 Scala 语言编写的用法高并发的编程框架 Akka 的高并发是由 Actor 与 Actor 之间的通信 ...

xiaoyaGrace的博客 719

【硬刚Hadoop】HADOOP MAPREDUCE(1):概述

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2MapReduce优缺点 2.1 优点 1)MapReduce易于编程 它简单的实现一些接口,就可以完成一个分布式程序..

微信搜:import_bigdata,大数据领域硬核原创作者 462

Java微服务架构师_Java 并发编程_002

synchronized几种使用方式 演示 (共享变量)同步锁的使用场景: 同步方法、 静态同步方法 、同步代码块 package com.allen.base.day02; import java.util.Random; public class SynchronizedDemo { public static void main(String[] args) { SynchronizedDemo demo = new SynchronizedDemo();

Coder_Boy_的博客 206

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Golang并发编程篇002_Go并发基础

Go语言以其卓越的并发支持而闻名。通过goroutine和channel等原生特性,Go提供了一种简洁而强大的并发编程模型。

ChineHe的博客 687

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java实现JT/T808以及T/GDRTA002-2020车辆协议对接

Java实现JTT808协议对接

qq_29648139的博客 3215

java并发编程

所以我在测试时,出现一个小插曲。2.linux查看线程信息。

qq_64071349的博客 514

楠哥教你学 Java|JUC 并发编程 002 期

Java大联盟 帮助万千Java学习者持续成长关注B 站搜索:楠哥教你学Java获取更多优质视频教程1、sleep 和 wait 的区别wait 的功能和 sleep 类似,都是让...

ningnan9801的博客 951

Java底层自学大纲_高并发篇

Java底层自学大纲_高并发篇

田宝宝的博客 521

系统架构设计师|关于系统架构-002

从本篇开始,梳理关于软考的系统架构设计师的文章,如果不对,还望指出。系统架构设计师 (System Architecture Designer) 是项目开发活动中的众多角色之一,它可以是一个人或一个小组,也可以是一个团队。架构设计师是系统开发的主体角色,构设计师的成果是创建架构,系统开发中架构设计师是整个系统的核心。架构设计师是负责系统架构的人、团队或组织 (IEEE1471-2000)。

Lycos 3918

[LeetCode] 002. Add Two Numbers (Medium) (C++/Java/Python)

002.Add_Two_Numbers (Medium)

水果君の日常 7618

《Java高并发超细教程》,掌握后,功力倍增

今天帮大家精选了一套《Java高并发超细教程》,堪称最全最细教程,大家看下目录就知道了,文末附视频地址。01.001-为什么学习并发 01.002-课程组织和特色 01.003-预备知识 02.001-本章内容 02.002-进程线程概念 02.003-并行并发概念 02.004-线程应用-异步调用 02.005-线程应用-提升效率 02.006-线程应用-提升效率-验证 02.007-线程应用-...

路人甲Java 134

java002

自学java的第二天(今天白天忙,只晚上看了一点点) 在刚开始学习java的时候不建议使用IDFA或eclipes等,推荐使用记事本,因为使用IDEA和eclipse在敲代码的时候会联想出很多单词,不利于新手记忆。 运行java代码的过程 java文件__javac.exe 编译__ >class文件 __ java.exe 运行 __>class文件 (在下载的环境中有javac.e...

weixin_44883047的博客 185

JAVA002

没有C就没有java,怎么解释? 解释dll/so/jni C的char和java的char 用c程序演示c的char -128~127 和 unsigned char 0 ~255;数据范围 用java输出‘张’ 的十进制(主机命令行运行) java运算符’+’的含义 解释System.out.println(‘a’+1+”a”); System.o...

598

Java002 【Java编程思想】第1章对象导论

摘自【Java编程思想】一书 第四版 Bruce Eckel著 陈昊鹏 译 目录 Java002 【Java编程思想】第1章对象导论 出版者的话 读者书评 译者序 前言 封面的故事 致谢 绪论 1.1抽象过程 1.2每个对象都有一个接口 1.3每个对象都提供服务 1.4 被隐藏的具体实现 1.5复用现有实现 1.6继承 1.7伴随多态的可互换对象 Java前期(静...

Dylaniou的博客 1952

java基础002

试卷一2013年年底的时候,我看到了网上流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的《Java面试大全》进行了全面的修订并重新发布在我的优快云博客。在修订的过程中,参照了当时JDK最新版本(Java 7)给出了题目的答案和相关代码,去掉了EJB 2.x、JSF等无用内容或过时内...

u014163736的博客 4万+
上一篇: UML在软件工程中的使用 建模—类图
下一篇: DevOps系列之 基于K8s构建DevOps平台
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值