- 博客(33)
- 资源 (1)
- 收藏
- 关注
原创 并发编程知识梳理(七)
为了保证能正确 实现volatile的内存语义,JMM在采取了保守策略:在每个volatile写的后面,或者在每个volatile 读的前面插入一个StoreLoad屏障。下面是基于保守策略的JMM内存屏障插入策略。上面的优化针对任意处理器平台,由于不同的处理器有不同“松紧度”的处理器内存模 型,内存屏障的插入还可以根据具体的处理器内存模型继续优化。举例来说,第二行最后一个单元格的意思是:在程序中,当第一个操作为普通变量的读或写时,如果第二个操作为volatile写,则编译器不能重排序这两个操作。
2023-12-25 21:59:05
845
1
原创 并发编程知识梳理(六)
在并发场景下,i变量的任何改变都会立马反应到其他线程中,但是如此存在多条线程同时调用increase()方法的话,就会出现线程安全问题,毕竟i++;保证被volatile修饰的共享变量对所有线程总数可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。volatile是Java虚拟机提供的轻量级的同步机制。volatile关键字有如下两个作用。在线程A改变了initFlag的属性之后,线程B能马上感知。禁止指令重排序优化。
2023-12-25 21:56:55
347
原创 并发编程知识梳理(五)
什么是JMM模型?Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。
2023-12-25 21:55:20
374
原创 并发编程知识梳理(四)
现代操作系统在运行一个程序时,会为其创建一个进程;例如,启动一个Java程序,操作系统就会创建一个Java进程。进程是OS(操作系统)资源分配的最小单位。
2023-12-25 21:51:57
405
原创 并发编程知识梳理(三)
因为当count=0被两个线程count++时,一个CPU可能从内存读取到count=0,并且在寄存器中执行了count++写回到了内存,这时候总线会通知其他读取count=0的cpu提示变量失效,但是存在一种情况,就是可能其他cpu已经将count在寄存器中执行了count++,这时候只是缓存中的变量失效了,但是寄存器中的值仍然需要写入到内存,这时候会就出现执行两次count++,结果是1的情况。CPU A同步CPU B的x,将cache a和同步后cache b中的x设置为S状态(共享)。
2023-12-25 21:47:13
810
原创 并发编程知识梳理(二)
Linux与Windows只用到了2个级别:ring0、ring3,操作系统内部内部程序指令通常运行在ring0级别,操作系统以外的第三方程序运行在ring3级别,第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换CPU运行状态,从ring3切换到ring0,然后执行系统函数,现代CPU为了提升执行效率,减少CPU与内存的交互(交互影响CPU效率),一般在CPU上集成了多级缓存架构,常见的为三级缓存结构。防止这部分区域多次读取。存储器速度快慢排序:寄存器>L1>L2>L3>内存;
2023-12-25 21:41:40
754
原创 Spring设计模式总结(一)
实现方式Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定实质由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类实现原理读取bean的配置,将bean元素分别转换成一个BeanDefinition对象。然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中,保存在它的一个ConcurrentHashMap中。
2023-12-25 21:38:07
956
原创 Spring设计模式总结(二)
Spring依赖注入Bean实例默认是单例的。Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。//参数true设置标识允许早期依赖//检查缓存中是否存在实例//如果为空,则锁定全局变量并进行处理。//如果此bean正在加载,则不处理。
2023-12-25 21:37:57
358
原创 Spring设计模式总结(三)
Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。动态地给一个对象添加一些额外的职责。Decorator模式相比生成子类更为灵活。
2023-12-25 21:37:43
328
原创 Spring设计模式总结(四)
spring的事件驱动模型使用的是 观察者模式 ,Spring中Observer模式常用的地方是listener的实现。事件机制的实现需要三个部分:事件、事件监听器、事件源。而在spring中对应ApplicationEvent抽象类、ApplicationListener接口、ApplicationContext接口ApplicationEvent抽象类继承自jdk的EventObject,所有的事件都需要继承ApplicationEvent,并且通过构造器参数source得到事件源.
2023-12-25 21:37:27
844
原创 Spring设计模式总结(五)
模板方法模式就是父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现。代码复用减少重复代码除了子类要实现的特定方法,其他方法及方法调用顺序都在父类中预先写好了。**共同的方法:**所有子类都会用到的代码抽象方法:父类中的是抽象方法,子类必须覆盖钩子方法:父类中是一个空方法,子类继承了默认也是空的注:为什么叫钩子,子类可以通过这个钩子(方法),控制父类,因为这个钩子实际是父类的方法(空方法)Spring 中的等以 Template 结尾的对数据库操作的类,这些就使用到了模板模式。
2023-12-25 21:37:11
875
原创 并发编程知识梳理(一)
我们写的java程序,通过javac编译之后形成class的字节码文件,然后通过classLoader类加载器加载到JVM中,之后程序运行指令,将运算指令加载到cpu的指令寄存器联合cpu的存储单元和运算单元进行计算。在上述模型图中最核心的是CPU和内存。
2023-12-25 21:36:46
825
原创 Spring-IOC源码浅析(四)
扩展了BeanFactoryPostProcessor,还有postProcessBeanFactory方法没有分析,这个方法是干嘛的,简单的来说,就是判断配置类是Lite配置类,还是Full配置类,如果是配置类,就会被Cglib代理,目的就是保证Bean的作用域。这里需要做一个补充说明,添加规则的时候,只是把具体的规则放入规则类的集合中去,规则类是一个函数式接口,只定义了一个虚方法的接口被称为函数式接口,函数式接口在java8的时候大放异彩,这里只是把规则方塞进去,并没有真正执行匹配规则。
2023-12-25 20:34:28
848
原创 Spring-IOC源码浅析(三)
这里有一个问题,为什么我自己写了个类,实现了BeanDefinitionRegistryPostProcessor接口,也打上了@Component注解,但是这里没有获得,因为直到这一步,Spring还没有完成扫描,扫描是在ConfigurationClassPostProcessor类中完成的,也就是下面第一个invokeBeanDefinitionRegistryPostProcessors方法。定义了一个Set,装载BeanName,后面会根据这个Set,来判断后置处理器是否被执行过了。
2023-12-25 20:33:54
883
原创 Spring-IOC源码浅析(二)
由于常规使用方式是不会用到AnnotationConfigApplicationContext里面的scanner的,这里的scanner仅仅是为了程序员可以手动调用AnnotationConfigApplicationContext对象的scan方法。所以这里就不看scanner是如何被实例化的了。在这里又要说明下,以常规方式去注册配置类,此方法中除了第一个参数,其他参数都是默认值。把目光回到最开始,再分析第二行代码。到这里注册配置类也分析完毕了。
2023-12-23 19:48:46
861
1
原创 Spring-IOC源码浅析(一)
Spring 最重要的概念是 IOC 和 AOP,其中IOC又是Spring中的根基:本文要说的 IOC 总体来说有两处地方最重要,一个是创建 Bean 容器,一个是初始化 Bean。
2023-12-23 19:35:30
956
1
原创 Spring Security衍生---整合SSO
EnableOAuth2Sso单点登录的原理简单来说就是:标注有@EnableOAuth2Sso的OAuth2 Client应用在通过某种OAuth2授权流程获取访问令牌后(一般是授权码流程),通过访问令牌访问userDetails用户明细这个受保护资源服务,获取用户信息后,将用户信息转换为Spring Security上下文中的认证后凭证Authentication,从而完成标注有@EnableOAuth2Sso的OAuth2 Client应用自身的登录认证的过程。启动授权服务和客户端服务;
2023-12-23 15:49:38
883
1
原创 Spring Security衍生---整合JWT
有时候我们需要扩展JWT中存储的内容,这里我们在JWT中扩展一个 key为enhance,value为enhance info 的数据。将令牌放入Authorization头中,访问如下地址获取信息: http://localhost:8080/user/getCurrentUser。发现获取到的令牌已经变成了JWT令牌,将access_token拿到https://jwt.io/ 网站上去解析下可以获得其中内容。运行项目后使用密码模式来获取令牌,之后对令牌进行解析,发现已经包含扩展的内容。
2023-12-23 15:32:38
478
1
原创 Spring Security衍生--JJWT使用Demo
我们刚才的例子只是存储了id和subject两个信息,如果你想存储更多的信息(例如角色)可以自定义claims。
2023-12-23 15:16:39
425
1
原创 Spring Security衍生--JWT介绍
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。官网: https://jwt.io/标准: https://tools.ietf.org/html/rfc7519。
2023-12-23 15:07:32
887
1
原创 OAuth2几种模式的demo
用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证 用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码 登录,手机短信登录,指纹认证等方式。使用oauth2时,如果令牌失效了,可以使用刷新令牌通过refresh_token的授权模式再次获取access_token。: 授权是用户认证通过根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则正 常访问,没有权限则拒绝访问。通过授权码,调用接口获取。
2023-12-23 14:54:49
942
1
原创 Spring Security OAuth几种模式
用户可以在登录的时候,指定授权层令牌的权限范围和有效期,"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。 简化模式不通过第三方应用程序的服务器,直接在浏览器中向授权服务器申请令牌,跳过了"授权码"这个步骤,所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。此时,每个发到 API 的请求,都必须带有令牌。
2023-12-23 14:22:20
1056
1
原创 Spring Security Oauth2简单介绍
OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方 应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他 们数据的所有内容。OAuth在全世界得到广泛应用,目前的版本是2.0版。OAuth协议:https://tools.ietf.org/html/rfc6749。
2023-12-23 13:55:05
836
1
原创 Mysql部分--存储引擎INODB介绍
这次我们直接通过网上搜罗的流程图来具体说明,具体详情如下: 前台⽤户各种操作触发后台sql执⾏,通过web项⽬中⾃带的数据库连接池:如dbcp、c3p0、druid 等,与数据库服务器的数据库连接池建⽴⽹络连接; 数据库连接池中的线程监听到请求后,将接收到的sql语句通过SQL接⼝响应给查询解析器,查询解 析器将sql按照sql的语法解析出查询哪个表的哪些字段,查询条件是啥;再通过查询优化器处理,选择该 sq最优的⼀套执⾏计划,然后执⾏器负责调⽤存储引擎的⼀系列接⼝,执⾏该计划⽽完成整个sql语句的
2023-12-23 12:00:21
1003
1
原创 开发坑:shardingJDBC 4.1.1 + PageHelper分页总数查询失败
例如:SELECT XXX,YYY FROM [TABLE_NAME] GROUP BY XXX,YYY,PageHelper在查询的时候会自动生成一个_COUNT后缀的Mapper,将其转换为SELECT COUNT(0) FROM (SELECT XXX,YYY FROM [TABLE_NAME] GROUP BY XXX,YYY)的形式去查询总数;但是需要注意添加索引,不然会有一定的性能影响。查询执行日志,发现SQL查询并未走分片逻辑,并未查询逻辑表数据,导致总数查询为0。执行引擎,支持复杂子查询。
2023-10-22 11:53:25
983
1
网站设计开题报告
2018-03-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人