攻克并发编程与高并发的难题视频一

攻克并发编程与高并发的难题

一、课程特点

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、并发引入

package com.mmall.concurrency.example.count;

import com.mmall.concurrency.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

@Slf4j
@NotThreadSafe
public class CountExample1 
{

    // 请求总数
    public static int clientTotal = 5000;

    // 同时并发执行的线程数
    public static int threadTotal = 200;

    public static int count = 0;

    public static void main(String[] args) throws Exception 
    {
    
        ExecutorService executorService = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(threadTotal);
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
        for (int i = 0; i < clientTotal ; i++) 
        {
            executorService.execute(() -> 
            {
                try 
                {
                    semaphore.acquire();
                    add();
                    semaphore.release();
                } 
                catch (Exception e) 
                {
                    log.error("exception", e);
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        log.info("count:{}", count);
    }

    private static void add() {
        count++;
    }
}

在多线程的并非环境下,如果不采取一些手段,结果很有可能是错的。

2、并发、高并发概念

并发:同时拥有两个或者两个以上的线程,如果程序在单核处理器上运行,多个线程将交替换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中的每个线程都将分配到一个处理器核上,因此可以同时运行

高并发:高并发树互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

3、CPU多级缓存

CPU核心和高速缓存之间有一个快速通道 。
主存和高速缓存都连载系统主件上。

高速缓存和主存之间的速度差异很大。直到加入另一级缓存,新加的缓存比上一级缓存大但是更慢。
在这里插入图片描述

4、为什么需要CPU多级缓存

为什么需要cpu缓存:CPU的频率实在太快了,快到主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源。所以cache的出现,是为了缓解CPU和内存之间速度的不匹配问题。(结构:CPU-》cache-〉memory)

cache的出现,是为了缓解CPU和内存之间速度的不匹配问题,因为CPU速度快,导致CPU等到主存

5、CPU多级缓存意义

缓存比主存小很多。

CPU cache有什么意义:

  • 时间局部性:如果某个数据被访问,那么在不久的将来它有可能被再次访问。
  • 空间局部性:如果某个数据被访问,那么与他相邻的数据很快也可能被访问。

6、CPU多级缓存-缓存一致性(MESI协议)

  • 用于保证CPU cache之间缓存共享数据的一致。

定义了Cache Line的四种状态,而CPU对Cache的操作可能会导致不一样的状态,因此缓存控制器监听到本地操作和远程操作,需要对地址一致的Cache Line做出一定的修改,从而保证在多个缓存之间数据的一致性。

在这里插入图片描述

7、MESI四种状态

Modified:被修改
指的是该缓存行的值被缓存在CPU的缓存中,并且是被修改过的,因此它与主存中的数据是不一致的,该缓存行的内存需要在未来某个时间点写回主存。这个时间点是在允许其他CPU读取主存中相应的数据之前。当被写回主存后,该缓存行的状态被改成E。

Exclusive:独享的
独享的状态指的是缓存行只被缓存在该CPU的缓存中,它是未被修改的,和主存中的数据一致。 这个状态可以在任何时刻当有其他CPU读取该内存时,变成共享状态。同样的,当CPU修改缓存行的内容时,该状态编程Modified状态 。

Shared:共享
Shared意味着该缓存行可能被多个CPU进行缓存,并且该缓存中的数据与主存中的数据是一致的,当有一个CPU修改该缓存行的时候,其他CPU中该缓存行是可以被作废的,变成Invalid状态。
Invalid:无效的
表示有其他CPU修改了该缓存行。

8、四种操作

local read:表示读本地缓存中的数据,
local write:表示将数据写到本地缓存里面
remote read:读取内存中的数据
remote write:将数据写回主存。
在这里插入图片描述在一个典型的多核系统中,每个核都有自己的缓存来共享主存数据,每个相应的CPU都会发出读写请求,而缓存的目的是为了减少CPU读写共享主存的次数。

9、CPU多级缓存-CPU乱序执行优化

指的是处理器为了提高运算速度而做出违背代码原有顺序的优化。

二、Java内存模型(JMM)

规定了一个线程如何和何时可以看到其他线程修改过的共享变量的值。

由于计算机的主存和处理器运算速度之间存在几个数量级的差距, 所以现在的计算机系统就不得不加入一层读写速度都尽可能接近处理器速度的高级缓存来作为内存与处理器之间的缓冲,将运算要使用到的数据复制到缓存中,让运算能够快速进行,当运算结束后,再将结果同步回内存中,这样处理器就不需要等待缓慢的内存读写。
在这里插入图片描述

每个线程都有一个私有的本地内存。
在这里插入图片描述

1、Java内存模型-同步八种操作

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2、Java内存模型-同步规则

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、并发的优势和风险

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值