从i++的线程安全问题,分析volatile
看看如下代码
123456789101112131415161718192021222324package com.wzl.day26;/** * @ClassName VolatileVisibility * @Description VolatileVisibility * @Author wuzhilang * @Date 2021/1/10 17:09 * @Version 1.0 */public class VolatileVisibility { public static volatile int i = 0; public static void increase(){ i++; } /** * 在并发场景下,i变量的任何改变都会立马反应到其他线程中,但是如此春仔多条线程同时调用increase()方法的话,就会出现线程安全问题,毕竟i++;操作 * 并不具备原子性,该操作是先取值,然后写回一个新值,相当于原来的值上加1,分两步完成如果第二个下城在第一个编程读取旧值和写会新值期间读取i ...
双冒泡语法
1234567* 双冒号语法* 1.静态方法引用(static method)语法:classname::methodname 例如:Person::getAge* 2.对象的实例方法引用语法:instancename::methodname 例如:System.out::println* 3.对象的超类方法引用语法: super::methodname* 4.类构造器引用语法: classname::new 例如:ArrayList::new* 5.数组构造器引用语法: typename[]::new 例如: String[]:new*/
设计模式2工厂模式
模式定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
简单工厂的模式样例应该是如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152package com.wzl.design.factory;/** * @ClassName SimpleFactory * @Description SimpleFactory * @Author wzl * @Date 2020/11/16 20:47 *///简单工厂public class SimpleFactory { public static Product createdProduct(String type) { if (type.equals("0")) { return new ProductA(); } else if ...
设计模式1单例模式
模式定义:
保证一个类只有
一个示例,并且提供一个全局访问点
场景:
重量级的对象,不需要多个实例,如线程池,数据库连接池。
懒汉模式:延迟加载,只有在真正使用的时候,才开始实例化。
1)线程安全问题
2)double check 加锁优化
编译器(JIT),CPU有可能对指令进行重排序,导致使用到尚未初始化的实例,
可以通过添加volatile关键字进行修饰,对于volatile修饰的字段,可以防止指令重排
如果我们这样写的话:
12345678910111213141516171819202122232425262728293031package com.wzl.design.lazysingleton;/** * @ClassName LazySingletonTest * @Description LazySingletonTest * @Author wzl * @Date 2020/11/15 17:35 */public class LazySingletonTest { public static void main(String[] args) ...
手撸IOC框架
IOC遵循是Spirng中对依赖倒转原则的原则,依赖倒转原则告诉我们:
上层模块不应该依赖底层模块,他们都应该依赖于抽象
抽象不应该依赖于细节,细节应该依赖于抽象
先读取bean的XML配置文件,然后使用beanId查找bean配置,并获取配置文件中class地址,得到地址后使用Java反射技术实例化对象,最后获取属性配置,使用反射技术进行赋值。详细步骤:
利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象
对于Document对象获取根元素对象后对下面的标签进行遍历,判断是否有符合的id.如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射建立对象.
遍历标签下的property标签,并对属性赋值.注意,需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.
如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应的对象,再给属性赋值.返回建立的对象,如果没有对应的id ...
pow(x,n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
Related Topics数学二分查找\n👍 533👎 0
第一种解法:快速幂+递归
12345678910111213public double myPow(double x, int n) { int N = n; return n >= 0 ? quickMUl(x, N) : 1.0/quickMUl(x, N);}pu ...
线程池代码
代码的注释都写在了这里
1. 线程的生命周期ExecutorService主要功能
1234567891011121314151617181920212223242526272829303132333435363738/** * 履行Ruannable类型的任务 * @param command */ void execute(Runnable command); /** * 可用来提交Callable或Runnable任务,并返回代表此任务的Future * 对象 * @param task * @param <T> * @return */ <T> Future<T> submit(Callable<T> task); /** * 在完成已提交的任务后封闭办事,不再接管新任务 */ void shutdown(); /** * 停止所有正在履行的任务并封闭办事。 * @return */ List<Runnable> shutdownNow(); /** * 测试是否所有任务 ...
JVM的类加载过程(1)
当我们执行java命令的时候,java命令是怎么执行的呢。
12345678910111213141516171819202122232425package com.wzl.jvm.math;/** * @ClassName Math * @Description Math * @Author wuzhilang * @Date 2020/8/15 18:36 * @Version 1.0 */public class Math { public static final int initData = 666; public static User user = new User(); public int compute() { //一个方法对应一块栈帧内存区域 int a = 1; int b = 2; int c = (a + b) * 10; return c; } public static void main(String[] args) { ...
设计规约
【强制】存储方案和底层数据结构的设计获得评审一致通过,并沉淀成为文档。 说明:有缺陷的底层数据结构容易导致系统风险上升,可扩展性下降,重构成本也会因历史数据迁移和系统平滑过渡而陡然增加,所以,存储方案和数据结构需要认真地进行设计和评审,生产环境提交执行后,需要进行double check。 正例:评审内容包括存储介质选型、表结构设计能否满足技术方案、存取性能和存储空间能否满足业务发展、表或字段之间的辩证关系、字段名称、字段类型、索引等;数据结构变更(如在原有表中新增字段)也需要进行评审通过后上线。 2. 【强制】在需求分析阶段,如果与系统交互的User超过一类并且相关的User Case超过5个,使用用例图来表达更加清晰的结构化需求。 3. 【强制】如果某个业务对象的状态超过3个,使用状态图来表达并且明确状态变化的各个触发条件。 说明:状态图的核心是对象状态,首先明确对象有多少种状态,然后明确两两状态之间是否存在直接转换关系,再明确触发状态转换的条件是什么。 正例:淘宝订单状态有已下单、待付款、已付款、待发货、已发货、已收货等。比如已下单与已收货这两种状态之间是不可能有直接转换关系的 ...
工程结构
(一) 应用分层
【推荐】图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于Web层,也可以直接依赖于Service层,依此类推:• 开放接口层:可直接封装Service方法暴露成RPC接口;通过Web封装成http接口;网关控制层等。• 终端显示层:各个端的模板渲染并执行显示的层。当前主要是velocity渲染,JS渲染,JSP渲染,移动端展示等。• Web层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。• Service层:相对具体的业务逻辑服务层。• Manager层:通用业务处理层,它有如下特征: 1) 对第三方平台封装的层,预处理返回结果及转化异常信息。 2) 对Service层通用能力的下沉,如缓存方案、中间件通用处理。 3) 与DAO层交互,对多个DAO的组合复用。• DAO层:数据访问层,与底层MySQL、Oracle、Hbase、OB等进行数据交互。• 外部接口或第三方平台:包括其它部门RPC开放接口,基础平台,其它公司的HTTP接口。
【参考】(分层异常处理规约)在DAO层,产生的异常类型有很多,无法用细粒度的异常进 ...