自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 力扣刷题之-----栈(共10道题,难度全部是简单)(2021年5月28-30日)

有效的括号难度:简单给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([)]”输出:false示例 5:输入:s = “{[]}”输出:true提示:1 &l.

2021-05-30 15:18:49 227

原创 简单的连接池实现

使用享元模式和多线程支持来保护数据库连接池的线程安全:连接池的属性和方法:大小连接对象状态构造方法初始化借连接归还连接import lombok.extern.slf4j.Slf4j;import java.sql.*;import java.util.Date;import java.util.Map;import java.util.Properties;import java.util.concurrent.Executor;import java.util.concur

2020-06-14 22:24:38 187

原创 原子累加器:LongAdder原理(伪共享原理)

使用LongAdder进行累加比使用AtomicLong性能更好的原因是:Long Adder在有竞争时,设置多个累加单元,Thread-0累加Cell[0]而Thread-1累加Cell[1]…最后将结果汇总,这样他们在累操作加时操作的是不同的Cell变量,因此减少了CAS重试失败,因此性能更高LongAdder类有几个关键域://累加单元数组,懒惰初始化transient volatile Cell[] cells;//基础值(如果没有竞争,则用cas累加这个域)transient vola

2020-06-14 17:28:57 576

原创 java8新特性----函数式接口和默认方法

函数式接口和默认方法函数式接口:当接口里面只有一个抽象方法的时候,就是函数式接口,可以使用注解强制限定接口只能有一个抽象方法注解:从java5开始引入注解,对字节码文件进行一些说明@FunctionalInterface注解的作用时用于在编译时告诉编译器该接口只能有一个抽象方法interface testFunctionalInterface {//接口里面只有一个抽象方法,该接口可以用于函数式编程void test1();}interface testFunctionalInterface

2020-06-12 11:27:06 345

原创 java8新特性---接口

6.12:函数式编程java8对接口的改变:1.增加了default方法和static方法,这两种方法完全可以有方法体2.default方法属于实例,static方法属于类(接口)3.接口里面的静态方法不会被继承,静态变量会被继承下来4.如果一个类实现了多个接口,并且这些接口互相之间没有继承关系,同时存在相同的默认方法,会报错:不相关默认值如果多个接口接口有继承关系,默认方法会被子接口覆盖5.如果遇到有多个继承,并且有相同的默认方法,实现类可以通过特殊语法指定要访问哪个接口的方法。在实现类或子

2020-06-12 10:06:11 100

原创 ABA问题及解决

ABA问hiyi题:在多线程环境下,一个线程需要修改共享变量的值,使用CAS操作时,当其他线程将该共享变量由A该为B,再将B改为A后,这个线程依然可以CAS操作成功,因为这个线程不能感知这个共享变量被修改过解决方法:给共享变量增加一个版本号,在CAS操作时不仅比较值是否相等,还比较版本号是否相等,,,因为所有的线程使用共享变量时都遵循相同的规则:给版本号加1代码示例:@Slf4j(topic = "c.TestABA")public class TestABA { static Atomi

2020-06-12 09:03:18 296

原创 AtomicInteger类中updateAndGet()的原理

public class TestAtomic { public static void main(String[] args) { AtomicInteger i=new AtomicInteger(0); System.out.println(i.incrementAndGet());//1 System.out.println(updateAndGet(i,p -> p/2)); } //模拟底层实现: public

2020-06-11 20:49:12 2457

原创 CAS模拟

package com.itheima.bookcurrentment;public class CASTest {public static void main(String[] args) {CompareAndSwap cas=new CompareAndSwap();for(int i=0;i<10;i++){new Thread(new Runnable() {@Overridepublic void run() {int expectedValue=cas.get();

2020-06-08 08:59:17 188 1

转载 算法题1-,2--连续子数组的最大和/判断子序列(简单)----6月7号

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100解题思路:一边遍历,一边累加,将结果放在一个变量中保存。累加的原则是这个数对结果的贡献为正,即

2020-06-07 17:34:23 191

原创 spring组件-----15

第18小节:给属性赋值—@Value写一个配置类:创建一个方法:在这个方法中给容器中注入一个person实例@Configurationpublic class MainConfigOfPropertyValues {@Beanpublic Person person(){return new Person();}}测试方法:在该方法中获取到容器中的实例,同时获取容器中的该实例的属性值public class IOCTest_PropertyValue {AnnotationConf

2020-06-04 20:55:37 103

原创 spring组件----15

第18小节:给属性赋值—@Value写一个配置类:创建一个方法:在这个方法中给容器中注入一个person实例@Configurationpublic class MainConfigOfPropertyValues {@Beanpublic Person person(){return new Person();}}测试方法:在该方法中获取到容器中的实例,同时获取容器中的该实例的属性值public class IOCTest_PropertyValue { Annotation

2020-06-04 20:51:36 143

原创 spring组件-----14

第16小节:遍历得到容器中所有的BeanPostProcessor,挨个执行beforeInitialization一旦返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorspopulateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw);//给bean进行属性赋值BeanPostProcessor原理:initializeBean{applyBeanPostProce

2020-06-04 15:53:20 96

原创 多线程下创建单例实例的方式

单例模式里有懒汉式和饿汉式,在多线程下需要用特殊的方式保证线程安全。下面我用一种方式实现饿汉式单例,两种方式实现懒汉式单例多线程下饿汉式单例://使用final修饰:防止子类覆盖父类中的方法,破坏单例public final class singleton implements Serializable { //构造方法私有化:防止其他类创建实例 private singleton(){} //创建实例,将其设置为static和final private stati

2020-06-04 11:02:22 368

原创 设计模式之犹豫模式----Balking

上篇博客中用volatitle实现的两阶段之终止模式,若在测试方法中执行两次monitorThread.start()方法,就会导致监控线程成对执行。有时候我们我们需要的某个线程已经被执行之后还有线程执行它就不再执行。如何保证某个方法只被执行一次,下次其他线程再执行就直接返回,不要执行了。在之前的方法中再添加一个是否已经被执行过了的标记,一开始是flase,表示还没有被执行,当它被执行后,将该标记设置为true:private boolean stop=false;if(starting){

2020-06-03 22:43:49 347 1

原创 用volatitle实现设计模式---两阶段终止

Two Phase Termination:在一个线程t1中如何优雅终止线程t2?这里的“优雅”指的是给t2一个料理后事的机会。。有一个监控线程,由于要去执行监控操作,因此它不断运行,每隔一秒钟执行一些监控操作,为了让他优雅退出,采用了中断的方式,比如在主线程中执行一个中断,若监控线程正在正常执行,中断这个监控线程后,它会设置中断标记为真,这时它不会进入catch块,等到下次循环判断时,发现这个中断标记为真,它可以做一些料理后事的工作,并退出这个监控循环。若主线程中断的监控线程正在sleep时,会进入ca

2020-06-03 22:06:25 118

原创 控制多线程的打印顺序---交替打印(3种方式)

方法1:package com.itheima.bookcurrentment;分析:/*前提:线程123分别输出abc需求:交替打印abc5次,打印结果示例:abcabcabcabc…思路:用同步方法,定义多个条件,满足条件时打印,不满足时进入wait等待设置一个整数,当数为1时打印1,当不是1时(相当于条件不满足)则进入wait等待 输出内容 等待标记 下一个标记 a 1 2 b 2 3

2020-06-03 20:12:10 1431 2

原创 控制多线程的打印顺序的两种方式

/*需求是:有两个线程,一个线程打印1,一个线程打印2,先打印2再打印1*/(1)使用wait/notify@Slf4j(topic = "c.PrintTest")public class PrintTest { static final Object lock=new Object(); static boolean t2runed=false;//表示t2是否运行过 public static void main(String[] args) { //

2020-06-03 18:32:29 594

原创 秒杀项目基础部分总结-----4(注册功能)

注册的逻辑:首先通过getotp页面获取otp短信验证码,该部分的逻辑和代码实现在之前已经讲过,此处则省略。然后跳转到注册页面,填写手机号和获取到的验证码,再填写其他信息后点击提交注册,这些数据通过前端的ajax请求传递到controller层,它的处理是,获取到前端传递的参数,进行校验,主要是判空和手机号与验证码是否匹配的校验,校验通过后再将前端传递的数据封装到Usermodel模型数据中,调用service的注册方法时作为参数,传递给dao层,它的处理是,先判断usermodel是否为空,若为空则返

2020-06-03 16:03:54 177

原创 秒杀项目基础部分总结-----5(登陆功能)

登陆的逻辑是:(校验用户手机号和验证码是否匹配)用户需要先注册才能登陆,所以登陆时数据中其实已经存在用户的信息,所以登陆时只需获取用户的手机号和密码,再去查询数据中该用户的手机号和密码与其输入的是否匹配,若是匹配则表示是同一个用户,显示登陆成功,跳转到详情页,否则提示登录失败。下面,结合代码整理下流程:(1)前端显示登陆页面用于用户填写用户信息:<body class="login"><div class="content"> <h3 class="form-

2020-06-03 15:31:22 205

原创 秒杀项目基础部分总结-----3(处理错误)

建立一个error包定义一个接口CommonError,定义三个抽象方法:获取错误码获取错误信息设置错误码定义一个枚举类型的类,定义错误码及对应的错误信息。实现CommonError接口,通过有参数构造,拿到错误码和错误信息,并实现接口的三个方法,,,,即:将获取到的错误码和错误信息通过get()方法给调用者,通过set()方法允许调用者设置错误码和错误信息public enum EnumBusinessError implements CommonError { //通用错误类型000

2020-06-03 11:41:32 151

原创 秒杀项目基础部分总结-----2(校验)

使用validator类进行验证:第一步:在pom中导入其依赖:<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version></dependency>第二步:首先定义一个校验结果类,用于返回校验结果该结果类中

2020-06-03 11:19:23 126

原创 spring组件----13

第15小节:【接口】BeanPostProcessor-------bean的后置处理器在bean初始化前后进行一些处理工作postProcessBeforeInitialization:在初始化之前工作postProcessAfterInitialization:在初始化之后工作编写一个后置处理器:(写一个类实现后置处理器接口)//后置处理器:初始化前后进行处理工作public class MyBeanPostProcessor implements BeanPostProcessor {/

2020-06-03 09:17:30 64

原创 spring组件----12

第14小节:可以使用JS250@PostConstruct,在bean创建完成并且属性赋值完成,来执行初始化@PreDestory:在容器销毁bean之前通知我们进行清理工作编写一个类,在其中实现init(),destory(),并在这两个方法上添加注解@PostConstruct,@PreDestorypublic class Dog {public Dog(){System.out.println(“dog constructor…”);}//对象创建并赋值之后调用@PostCons

2020-06-03 08:59:39 59

原创 spring组件---11

第13小节:通过Bean实现InitializingBean接口(定义初始化逻辑)DisposableBean接口(定义销毁)编写一个类,首先上述两个接口public class Cat implements InitializingBean, DisposableBean {public Cat(){System.out.println(“cat constructor…”);}public void destroy() throws Exception {System.out.prin

2020-06-03 08:47:29 58

原创 spring组件-----10

第12小节:bean的生命周期bean的生命周期是指:bean的创建—bean的初始化——bean的销毁的过程容器管理bean的生命周期:容器帮我们创建bean,初始化和销毁bean我们可以自定义初始化和销毁方法,容器bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法一共有4种方式:1)指定初始化和销毁方法以前在bean.xml中,在bean标签中可以通过添加属性:init-method=“” destroy-method=“” 指定其初始化和销毁方法使用注解方式:编写一个

2020-06-03 08:30:55 56

原创 spring组件-----9

第11小节:使用spring提供的factoryBean(工厂Bean)编写一个类实现FactoryBean接口://创建一个spring定义的factoryBeanpublic class ColorFactoryBean implements FactoryBean {//返回一个Color对象,这个对象会添加到容器中public Color getObject() throws Exception {System.out.println(“ColorFactoryBean。。。 getOb

2020-06-02 20:56:58 64

原创 spring组件---8

第10小节:ImportBeanDefinitionRegistrar接口,该接口中有个方法registerBeanDefinitions,通过调用这个方法可以给容器中自己来添加一些方法,这个方法有个参数AnnotationMetadata,包含当前类的注解信息,BeanDefinitionRegistry:bean定义的注册类,可以通过它给容器中添加bean.写一个类MyImportBeanDefinitionRegisterar继承 ImportBeanDefinitionRegistrar在这个类

2020-06-02 20:24:42 75

原创 spring组件----7

6月2号:第9小节: @ImportSelector:返回需要导入的组件的全类名数组编写一个selector类://自定义逻辑返回需要导入的组件public class MyImportSelector implements ImportSelector {//返回值,就是到导入到容器中的组件全类名//AnnotationMetadata:当前标注@Import注解的类的所有注解信息public String[] selectImports(AnnotationMetadata annota

2020-06-02 19:49:42 84

原创 秒杀项目基础部分总结-----1

设计用户信息模型数据:package com.miaoshaproject.service.model;import javax.validation.constraints.Max;import javax.validation.constraints.Min;import javax.validation.constraints.NotBlank;import javax.validation.constraints.NotNull;public class UserModel {priv

2020-06-01 15:15:21 248

原创 spring组件-6

第7小节:按照条件给容器中添加bean@Conditional:按照一定的条件进行判断,满足条件给容器中注册bean在配置类中添加两个将组件加入到容器中的方法:@Configurationpublic class MainConfig2 {@Bean("bill")public Person person01(){ return new Person("Bill Gates",62);}@Bean("linus")public Person person02(){ retu

2020-05-30 18:07:29 99

原创 spring组件---5

单实例bean:默认在容器启动的时候创建对象懒加载:容启动不创建对象,第一次使用(获取)bean创建对象,并初始化测试单实例bean不尽兴懒加载:使用@Lazy不加@Lazy时:@Configurationpublic class MainConfig2 {@Bean(“person”)public Person person(){System.out.println(“给容器中添加person…”);return new Person(“xy”,12);}}测试类:@Testp

2020-05-30 15:45:34 56

原创 spring组件---4

第4小节:@Scope组件写一个新的配置类:@Configurationpublic class MainConfig2 {@Bean(“person”)public Person person(){return new Person(“xy”,12);}}编写一个测试类:public void IOCTest02() {//指定配置类所在的位置,返回ioc容器AnnotationConfigApplicationContext applicationContext = new An

2020-05-29 14:05:07 85

原创 spring组件-3

第3小节:自定义TypeFilter指定过滤规则在配置类上的包扫描注解中添加属性:@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {BookService.class})@Configuration //告诉spring这是一个配置类@ComponentScan(value = “com.atguigu”,includeFilters = {@ComponentScan.Filter(type = FilterT

2020-05-29 13:28:34 208

原创 spring组件---2

@ComponentScan以前写法:person类不变配置文件中添加扫描标签:<context:component-scan base-package="com.atguigu"></context:component-scan><?xml version="1.0" encoding="UTF-8"?><context:component-scan base-package="com.atguigu"></context:comp

2020-05-29 10:09:38 89

原创 spring组件---1

5.29日:spring认为所有的组件都应该放在ioc容器中,组件之间的关系通过容器进行自动装配,也就是我们所说的依赖注入。@Cconfiguration&@Bean. 给容器中添加组件原来的实现方式:写一个person类,实现getter和setter方法,tostring方法public class Person {private String name;private Integer age;。。。。。。。}写一个beans.xml配置文件:在里面用bean 标签指定pe

2020-05-29 09:29:49 77

原创 多线程练习---交替打印/多线程下安全实现懒汉式单例模式

5月27使用双重检查DCL实现多线程下懒汉式单例模式:package com.itheima.bookcurrentment;import lombok.SneakyThrows;import java.util.concurrent.TimeUnit;public class MyObject {private volatile static MyObject myObject;private MyObject(){}public static MyObject getInstance()

2020-05-27 10:27:31 102

原创 java基础知识整理

1.抽象类和接口的区别抽象类:抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板接口:接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。接口主要是用来抽象类型的共性,例如说,容器的可迭代特性...

2020-04-12 09:10:34 73

转载 MySQL:[Err] 1292 - Incorrect datetime value: '0000-00-00 00:00:00' for column 'CREATE_TIME' at row 1

转载于:https://blog.csdn.net/sinat_40770656/article/details/101198274?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-...

2020-04-08 11:23:23 959

原创 CRUD小练习中的问题

1.使用idea编辑jsp页面的时候,发现不能使用pageContext.setAttribute,报红解决方法参考博客:https://blog.csdn.net/lwx356481/article/details/843291092.IDEA对选中的多行代码上下左右移动一、选中代码二、代码右移:TAB键三、代码左移:shift+TAB键四、代码上移:shift+alt +方向键上...

2020-03-31 09:46:09 120 1

原创 Mac下redis的启动

(1)切换到redis的目录下:cd /usr/local/redis-5.0.5/(2)启动服务器的命令:src/redis-server(1)新建命令窗口(2)切换到redis的目录下:/usr/local/redis-5.0.5/(3)启动客户端的命令:src/redis-cli...

2020-03-31 09:45:31 318

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除