多线程与高并发(持续更新中)

Java 多线程详解(持续更新) 目录 认识cpu、核心与线程 java多线程系列(一)之java多线程技能 认识cpu、核心与线程 cpu与核心 物理核 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数 虚拟核 ● 所谓的4核8线程,4核指的是物理核心。通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为8线程。 ● 在操作系统看来是8个核,但是实际上是4个物理核。 ● 通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核。 单核cpu和多核cpu 阅读详情

基础概念

进程

  • 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
  • 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
  • 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元

线程

  • 一个进程可以有很多线程,每条线程并行执行不同的任务
  • 是操作系统能够进行运算调度的最小单位

创建的不同方式

  • 继承 Thread
static class MyRun implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello MyRun!");
    }
}
  • 实现 Runable,优先选择该方案,因为java是单继承
static class MyRun implements Runnable {
        @Override
        public void run() {
            System.out.println("Hello MyRun!");
        }
    }
  • 实现Callable
static class MyCall implements Callable<String>{
   @Override
     public String call() throws Exception {
         return null;
     }
}
  • 线程池

启动方式

  • 方式1
new MyThread().start();
  • 方式2
new Thread(new MyRun()).start();
  • 方式3
new Thread(()->{
   System.out.println("hello ,Lambda");
}).start();
  • 方式4
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(()->{
      System.out.println("Hello , thread pool");
  });
executorService.shutdown();

方法

  • join
  • sleep
  • yield
  • wait(继承Object)
  • notify(继承Object)

生命周期

  • 开始
    新生状态
  • 就绪
    准备开始执行,并没有执行,调用start之后
  • 运行
  • 阻塞
    阻塞状态,在程序运行过程中,发生某些异常
  • 结束
    死亡状态

synchronized

  • 保证同一时刻最多只有一个线程执行这段代码
  • 锁可重入(一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁.)
  • 程序中出现异常,默认情况下锁会释放
  • 同步方法和非同步方法可同时调用

底层实现

  • JDK早期 重量级,需要向操作系统申请
  • 改进,锁升级
    markwork记录线程id(偏向锁)
    如果线程争用,升级为自旋锁
    默认在自旋10次之后(JDK1.6),升级为重量级锁;或者在自旋线程超过CPU内核数的一半时,升级为重量级锁。

锁的四种状态

  • 无锁
  • 偏向锁,适用于单个线程
  • CAS(自旋锁),默认自旋10次,适用于并发数少,操作时间短
  • 重量级锁(OS),适用于并发数大,操作时间长
    锁只能升级,不能降级
    无锁 -> 偏向 -> CAS -> 重量

对某个对象加锁

	private int count = 10;
	private Object o = new Object();
	public void m() {
        //任何线程要执行下面的代码,必须先拿到o的锁
		synchronized(o) { 
			count--;
			System.out.println(Thread.currentThread().getName() + " count = " + count);
		}
	}
	private int count = 10;
	public void m() {
		//任何线程要执行下面的代码,必须先拿到this的锁
		synchronized(this) { 
			count--;
			System.out.println(Thread.currentThread().getName() + " count = " + count);
		}
	}
	private int count = 10;
	//等同于在方法的代码执行时要synchronized(this)
	public synchronized void m() { 
		count--;
		System.out.println(Thread.currentThread().getName() + " count = " + count);
	}
  • 静态方法,锁duXXX.class
public class T {

	private static int count = 10;
    /**
     * 这里等同于synchronized(T.class)
     * */
	public synchronized static void m() { 
		count--;
		System.out.println(Thread.currentThread().getName() + " count = " + count);
	}
	
	public static void mm() {
		synchronized(T.class) { //考虑一下这里写synchronized(this)是否可以?
			count --;
		}
	}

}

volatile

  • 禁止指令重排序
    Double check Lock(单例模式 双重检查)
  1. 申请内存
  2. 赋值
  3. 指定地址
  • 保证线程可见性
  • MESI,缓存一致性协议

AtomicXXX

原理

CAS

ABA 问题

通过加版本号解决该问题

累加实现

  • atomic
  • sync
  • LongAdder
    1. 分段锁
    2. 并发高时效率最高

线程池

ForkJoinPool

ForkJoinPool


ScheduledThreadPool

ScheduledThreadPool

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
        System.out.println(System.currentTimeMillis());
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("延迟三秒执行");
                System.out.println(System.currentTimeMillis());
            }
        },3, TimeUnit.SECONDS);

        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("延迟一秒,没三秒执行一次");
                System.out.println(System.currentTimeMillis());
            }
        },1,3, TimeUnit.SECONDS);

ThreadPoolExecutor

CachedThreadPool

  ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 20 ; i++) {
            executorService.execute(new Task());
        }

FixedThreadPool

ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 20 ; i++) {
            executorService.execute(new Task());
        }

SingleThreadPool

 ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 20 ; i++) {
            executorService.execute(new Task());
        }

拒绝策略

Exchanger

  • 两个线程交换数据,会进入阻塞状态
  • exchange()

Semaphore

  • new Semaphore(2)
    只能同时运行两个,起到限流的作用
  • s.acquire() 获取
  • s.release() 释放

ReadWriteLock

  • readWriteLock.readLock()
  • readWriteLock.writeLock()

Phaser

  • phase.arriveAndDeregister()
  • phase.register()
  • phase.bulkRegister(7)
  • phaser.arriveAndAwaitAdvance();

CyclicBarrier

new CyclicBarrier(20,new Runnable())
barrier.await()

CountDownLatch

latch.countDown()
latch.await()
原理:CAS

ReentrantLock

tryLock(5,TimeUnit.SECONDS)
lockInterruptibly()
	可对interrupt()做出响应
公平锁和非公平锁
原理:CAS
【Java多线程】高并发修炼基础之高并发必须了解的概念 - **`单核CPU(单处理器)上`,只可能存在`并发`而不可能存在并行。** - **`并行在多处理器(多CPU)系统中存在,而并发可以在单处理器和多处理器系统中都存在`**,并发能够在单处理器系统中存在是因为 "并发是并行的假象",**`并行要求程序能够同时执行多个操作`**,而 **`并发只是要求程序假装同时执行多个操作`(每个小时间片执行一个操作,多个操作快速切换执行)** - **并发是`“伪并行”`,看似并行,而实际上还是一个`CPU(单处理器)`执行一切事物,只是`切换的太快`,我们没法察觉 阅读详情

相关推荐

FPGA实战:用Verilog实现Costas环载波同步(附Vivado2019.2仿真步骤)

本文详细介绍了如何在FPGA上使用Verilog实现Costas环载波同步,包括核心原理、Vivado2019.2工程配置、代码实现及仿真验证。通过正交下变频、相位误差检测和环路滤波等关键模块的设计,帮助开发者掌握数字通信系统中的载波同步技术,并提供了实用的调试和优化技巧。

k0l1m2n3o的博客 134

多线程并发更新实时数据

项目中遇到一个需要批量更新数据的需求,要求将实时传过来的数据实时更新到数据库中一开始只是简单的调用mapper的更新接口,没啥问题,后期发现数据太多一直在请求接口,数据无法实时更新到数据库中,后来引入了线程池解决...

weixin_40598838的博客 2769

图像去雾新思路:手把手教你复现DEA-Net中的“细节增强卷积”与PyTorch实现

本文详细解析了DEA-Net中的'细节增强卷积'(DEConv)与PyTorch实现,通过多分支差分卷积和重参数化技术,显著提升单图像去雾效果。文章从数学原理到代码实现,手把手指导复现这一创新架构,帮助开发者在保持轻量化的同时实现41dB以上的PSNR指标,适用于自动驾驶、遥感监测等关键领域。

weixin_30323631的博客 505

JAVA多线程之间实现同步+多线程并发同步解决方案

一、什么是线程安全问题 为什么有线程安全问题?       当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作时不会发生数据冲突问题。案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。/** * 需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 * Crea...

yz2015的博客 4万+

Win11显卡驱动安装失败的全面解决方案

Windows 11显卡驱动安装失败是一个比较常见的问题,但通过上述方法,我们可以有效地解决这一问题。方法一通过调整组策略编辑器的驱动程序安装策略,可能解决一些因签名问题导致的安装失败;而方法二则通过重装Windows 11系统,为系统提供一个全新的、干净的环境,从而可能解决更复杂的安装问题。在实际操作中,用户可以根据具体情况选择合适的方法来解决显卡驱动安装失败的问题。

nntxthml的博客 2662

基于角谱传播的MATLAB仿真:从相位恢复看自由空间光传播

本文详细介绍了基于角谱传播理论的MATLAB仿真方法,用于模拟自由空间光传播过程。通过傅里叶光学原理,将光场分解为频谱并应用传播相位滤波器,实现了从纯相位物体到可观测衍射图样的仿真。文章结合具体代码,演示了如何利用角谱法进行相位恢复,为计算成像和生物医学检测等领域的研究提供了实用的仿真工具和思路。

weixin_29055699的博客 282

多线程并发更新同一条记录

有一个任务表,每个任务有n个事项要并发处理, 每个事项完成时需要更新已完成数,即finished+1,当n个事项全部处理完成即整个任务完成时需要做任务的统计工作。 数据库通过行级锁来保证并发更新准确性,测试代码如下: publicclassConcurrency{ /**执行更新语句,根据commitImmediately决定是否立即提交*/ ...

u011250186的博客 4353

FISCO BCOS 三、多群组部署以及新节点加入群组

本章主要以星形组网和并行多组组网拓扑为例,指导您了解如下内容:了解如何使用创建多群组区块链安装包;了解创建的多群组区块链安装包目录组织形式;学习如何启动该区块链节点,并通过日志查看各群组共识状态;学习如何向各群组发送交易,并通过日志查看群组出块状态;了解群组内节点管理,包括节点入网、退网等;了解如何新建群组。

qq_63235624的博客 2920

MySQL 多线程并发更新同一行,通过主键id更新,死锁问题以及解决

最近项目中用到Job+多线程并发执行更新同一行数据,通过主键id更新的场景,但是任务一执行就出现dead lock异常,经过分析和排查,发现多线程并发读取同一行数据获取共享锁(Shard Lo)

做技术,贵在学习与坚持! 7149

Fiori Elements 的 Adapting the UI: Analytical List Page 全解析与实战

摘要:本文详细介绍了如何通过SAP Fiori elements的UI Adaptation功能对Analytical List Page(ALP)进行细粒度适配。重点讲解了页头过滤区、图表区域、表格区域等关键组件的可配置属性,包括过滤区折叠/固定、图表类型限制、表格滚动阈值等实用功能。文章强调这些适配均可通过可视化工具完成,无需修改业务代码,并提供了典型场景的实践清单。适用于SAP Fiori elements for OData V2项目,建议配合SAP Fiori tools的Adaptation E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 436

《Java开发及前端最全面试题-Offer直通车》目录

Java开发是需求最广,工资高的细分领域,同时也是会的人最多,有的公司招1个Java开发,要面试几十甚至上百面试者,同时要求很高,要求通晓技术栈很多及很深深度。如果你正准备面试,想要脱颖而出,那么《Java开发及前端最全面试题-Offer直通车》是你的不二选择。本书汇集了多篇超过1万字的精华内容,无论是Java基础、数据库、SpringBoot和SpringCloud等必问的,还是前端、k8s等容器和虚拟化和大数据各类技术面试,本书都为你提供了最全面的试题和参考答案。

大模型大数据攻城狮的专栏 1178

什么是高并发;超发的解决思路(悲观锁与乐观锁);高并发与多线程的关系--持续更新

关键词: 线程,同步,单例,高并发,高访问,死锁 一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态。我们现在一起来讨论下,优化的思路和方法哈。 1. 请求接口的合理设计 一个秒杀或者抢购页面,通常分为2个部分,一个是静态的H

zsvole的博客 2万+

数据仓库从明细到汇总:DWD与DWS层建模实战指南

DWS层的“主题”是指业务分析的核心场景,通常分为“用户主题、商品主题、订单主题、营销主题”等。主题的定义需紧密结合业务需求,避免“为了汇总而汇总”。例如,电商平台的核心业务需求包括“用户活跃度分析”“商品销售情况分析”“订单转化分析”,对应的DWS层主题即可定义为“用户主题汇总表”“商品主题汇总表”“订单主题汇总表”。主题定义时需注意“粒度适中”——汇总粒度既不能过细(否则与DWD层重复,失去汇总意义),也不能过粗(否则无法满足细分分析需求)。

2401_83088008的博客 644

面试官: 高并发与多线程区别解析(答案深度解析)持续更新

⚠️ 注意:这道题不是考定义背诵,而是考察你有没有。很多候选人一上来就说“多线程就是高并发”,当场被挂——这不是技术问题,是概念混淆导致的架构误判。

huazaijake的博客 294

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

探索JAVA多线程编程技术的宝库:JAVA多线程编程技术PDF

探索JAVA多线程编程技术的宝库:JAVA多线程编程技术PDF 去发现同类优质开源项目:https://gitcode.com/ JAVA多线程编程技术PDF简介 深入掌握JAVA多线程编程,提升代码性能与稳定性。 项目介绍 在软件开发领域,多线程编程是一项关键技术,它能够有效提升应用程序的执行效率。在这样的背景下,《JAVA多线程编程技术PDF》应运而生,这是一份全面深入讲解JAVA多线程编程的...

gitblog_06716的博客 732

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA后端开发知识总结(持续更新...)

JAVA后端开发知识总结   我将平时所学的内容笔记整理好后逐步搬迁至优快云上,同时还有各类知识点的补充,本文是对所有内容的一个索引,希望大家一起讨论交流,共同进步。   作者不定期持续更新中… 文章目录JAVA后端开发知识总结1.计算机网络1.1 基础知识总结2.网络编程 1.计算机网络 1.1 基础知识总结 应用层:1.概述及Socket 应用层:2.域名解析系统DNS(UDP协议) 应用层:3.文件传送协议FTP(TCP协议)及电子邮件(TCP协议) 应用层:4.万维网WWW及HTTP协议 2.

weixin_43415481的博客 955

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

多线程面试题(史上最强、持续更新、吐血推荐)

文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备 资源宝库: Java程序员必备 网盘资源大集合 价值>1000元 随便取 GO->【博客园总入口 】 独孤九剑:Netty灵魂实验 : 本地 100W

架构师尼恩 1403

多线程基础 [持续更新]

// 我是练习时长半小时的个人线程练习生,喜欢高并发,多并行,上下文切换。 基础概念 CPU核数和线程的关系:核心数:线程数=1:1 ,超线程有技术->1:2 CPU时间片轮换机制:上下文切换(RR调度) 进程与线程: 进程:程序运行时资源分配的最小单位。进程内部有多个线程,会共享进程的资源。 线程:CPU调度的最小单位,线程依附进程。 并行和并发: 并发:某个时间段内处理的事 并行:同一时...

weixin_44796147的博客 151

Java面试场景题及答案总结(2025版持续更新)

Java面试不仅考察知识点的记忆,更注重解决问题的能力。建议读者在理解这些场景题的基础上,结合实际项目经验进行思考。需要这份Java面试题(2025版)文档的小伙伴,观住+留“求资料”免费领取!

2501_91715693的博客 5603

分布式、多线程、高并发是什么?

说句实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。推荐一份Java架构之路必备的学习笔记,内容相当全面!!!成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?

2401_84048895的博客 832

多线程与高并发

进程是操作系统进行资源分配的基本单位Java 内存模型规定所有的共享变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(比如CPU的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作,并且每个线程不能访问其他线程的工作内存。之所以要用自己的本地内存,主要是利用缓存和改变执行代码顺序达到程序执行效率优化。

2304_80073016的博客 633

Java多线程(持续更新)

是独立的运行程序比如咱们电脑软件,你启动起来以后,他就是一个进程。qq idea进程需要windows系统的分配。可以获取当前的系统的网卡,内存,显卡等1.独立性各个进程之间是相互的独立的互不影响 的。录屏软件和idea没有关系的2.互斥性每个软件系统都会分配一个独立端口号,如果启动一个软件以后他的端口号97。如果再启动另外一个软件,另外一个软件如果端口也是97,这个程序就启动不了,端口被占用的脑海里面知道开启的软件就是一个进程 即可!!!进程是由多个或者一个线程组成的。

iov_a的博客 2124

北上广深,2024,多少K的Java程序员应该懂高并发多线程和JVM优化

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源。

2401_83703893的博客 745

【Java多线程优化解构高并发场景下的性能瓶颈与优雅实现】

现代CPU核心数的增速远落后于业务请求量的增长,当并发量突破万级时,线程上下文切换消耗的CPU时间会从常见的3%陡增至12%以上。特别值得注意的是,volatile变量的字段访问会在编译器层面产生额外的内存屏障指令,导致代码实际执行耗时比理想值高2-5倍。务必确保异步边界处的数据边界性设计,可添加 crc32 校验和时间戳以保证消息的完整性,避免因网络抖动导致的处理结果不一致。通过动态调整锁的租赁期(Lease Time),在保证数据一致性前提下,锁的获取成功率从88%提升到99.7%。

fblBQhfu的博客 635

多线程(持续更新)

【代码】多线程(持续更新)

kfdbes 419
上一篇: Redis 5
下一篇: MySQL数据去重
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值