![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 77
入门小站
这个作者很懒,什么都没留下…
展开
-
第十五节:SpringBoot使用JPA访问数据库
JPA是Java Persistence API的简写,是官方提出的一种ORM规范!JPA规范,都在包路径:javax.persistence.*下,像一些常用的如:@Entity、@Id及@Transient都在此路径下。这些也是一些现在市面上常用的ORM一些约定俗成的注解了。Spring Data JPA是Spring基于Hibernate开发的一个JPA框架。可以极大的简化JPA的写法,可以在几乎不用写具体代码的情况下,实现对资料的访问和操作。除了「CRUD」外,还包括如分页、排序等一些.原创 2022-02-23 17:13:46 · 1564 阅读 · 1 评论 -
第十四节:SpringBoot使用JdbcTemplate访问操作数据库基本用法
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。JdbcTemplate在Spring-jdbc包下面,还需要Spring-tx包支持,里面包含事务和异常控制.建一个rumenz_springboot库创建user表create table user( id int primary key auto_increment, name varchar(100) not null def.原创 2022-02-21 14:59:20 · 486 阅读 · 0 评论 -
第十三节:使用Lombok简化你的代码
文章目录pom.xml添加lombok@Getter @Setter注解@NonNull注解@ToStringEqualsAndHashCode注解@Data注解@Cleanup注解@NoArgsConstructor注解@RequiredArgsConstructor注解@AllArgsConstructor注解@Value注解@SneakyThrows注解@Synchronized注解@Builder注解@SuperBuilder在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去产生原创 2022-02-18 14:38:00 · 376 阅读 · 1 评论 -
第十二节:Springboot多环境配置
开发的阶段会需要设定基本的属性或是自定义的属性,而且通常会被应用和安装到几个不同的环境上,比如:开发(dev)、测试(test)、生产(prod)等,其中对应的每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误。通常有下面两种配置方式1.maven的多环境配置在没有使用过Spring Boot的多环境配置时,是用maven的profile功能进行多环境配置。maven配置pom.xml .原创 2022-02-16 11:55:13 · 151 阅读 · 0 评论 -
第十一节:Springboot整合log4j2日志
SpringBoot默认使用的是logback, 但是还有一个性能更高的日志实现框架log4j2.为什么选用log4j2相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;下面是来自网络上一张性能对比图片同步日志模式下, Logback的性能是最糟糕的,log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的log4j2性能高的主要原因是它用了一个L.原创 2022-02-14 11:35:32 · 467 阅读 · 0 评论 -
第十节:SpringBoot中的日志管理
SpringBoot默认使用的日志框架是logback 。spring-boot-starter中包含了spring-boot-starter-logging模块。该日志框架就是logback。所以我们也不需要单独引入spring-boot-starter-logging模块。 org.springframework.boot spring-boot-starter-loggingSpringBoot默认日志格式格式说明时间戳,精确到毫秒:2021-11-13 14:.原创 2022-02-12 13:48:08 · 590 阅读 · 0 评论 -
第九节:SpringBoot在线文档Swagger2入门
Swagger2 是一个开源项目,用于为 RESTful Web 服务生成 REST API 文档。它提供了一个用户界面,可以通过 Web 浏览器访问我们的 RESTful Web 服务,测试接口。SpringBoot集成Swagger2 3.0以下版本pom.xml io.springfox springfox-swagger2 2.9.2 io.springfox springfox-swagger-ui 2.9.2Swagger2Config配置文件package c.原创 2022-02-10 13:09:43 · 361 阅读 · 0 评论 -
第八节:SpringBoot指定配置文件配置三
SpringBoot配置属性的规则通过.分离各个元素最后一个.将前缀与属性名称分开必须是字母(az)和数字(0-9)必须是小写字母用连字符-来分隔单词唯一允许的其他字符是[和],用于List的索引不能以数字开头相同的配置项Spring Boot 2.x 加载配置文件的时候会移除特殊字符并且还会将配置均用全小写的方式进行匹配和加载。application.propertiescom.rumenz.id-name=rumenzcom.rumenz.id_name=rumenz原创 2022-02-08 22:48:34 · 745 阅读 · 0 评论 -
第七节:SpringBoot高级属性配置二
SpringBoot的配置文件中,除了前面讲的基本配置方式。还可以配置List,Map,随机值等高级数据类型配置随机数com.rumenz.random=${random.value}com.rumenz.num=${random.int}com.rumenz.long.val=${random.long}com.rumenz.uuid=${random.uuid}com.rumenz.range=${random.int[100,1000]}测试案例package com.rum.原创 2022-02-04 15:46:48 · 388 阅读 · 0 评论 -
第六节:SpingBoot基本配置一
SpringBoot默认的配置文件为application.properties或者application.yml,应用启动时会自动加载此文件,无需手动引入。自定义属性在application.properties中定义属性值#自定义属性rumenz.name=rumenzrumenz.url=https://rumenz.com通过@Value注解来获取值@RestController@RequestMapping("/rumenz")public class Rumenz.原创 2022-01-29 22:04:50 · 950 阅读 · 0 评论 -
第五节:SpringBoot常用注解介绍
文章目录启动类上的注解前端控制器`@Controller``@RestController``@RequestMapping`value,methodconsumes,producesparams,headers`@RequestBody`和`@ResponseBody``@RequestBody``@ResponseBody``@PathVariable`,`@RequestParam`,`@ModelAttribute`,`@RequestAttribute``@PathVariable``@Reque原创 2022-01-27 13:36:37 · 345 阅读 · 0 评论 -
第四节:SpringBoot中web模版数据渲染展示
在第一节我们演示通过接口返回数据,数据没有渲染展示在页面上 。在这里我们演示一下从后台返回数据渲染到前端页面的项目案例.模板引擎SpringBoot是通过模版引擎进行页面结果渲染的,官方提供预设配置的模版引擎主要有ThymeleafFreeMarkerVelocityGroovyMustache我们在这里演示使用Thymeleaf和FreeMarker模板引擎。ThymeleafThymeleaf是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。Th.原创 2022-01-24 11:40:20 · 553 阅读 · 0 评论 -
第三节:SpringBoot中web项目推荐目录结构
第三节:SpringBoot中web项目推荐目录结构原创 2022-01-20 11:46:33 · 1546 阅读 · 0 评论 -
第二节:SpingBoot单元测试
SpingBoot 365计划开始更新了,计划手敲365个SpringBoot案例回顾总结形成知识体系。目前已经输出了32节的内容。所有源码托管在GitHub和Gitee上。原创 2022-01-17 11:52:41 · 675 阅读 · 0 评论 -
jstack处理Java中CPU100%的思路流程
模拟问题代码构造一个死循环,造成CPU使用率100%。> vim InfiniteLoop.javapublic class InfiniteLoop { public static void main(String[] args) { Runnable target; Thread thread=new Thread(new Runnable() { @Override public void run原创 2021-02-09 23:52:16 · 305 阅读 · 1 评论 -
Java高并发之CountDownLatch源码分析
概述CountDownLatch 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。简单来说,就是 CountDownLatch 内部维护了一个计数器,每个线程完成自己的操作之后都会将计数器减一,然后会在计数器的值变为 0 之前一直阻塞,直到计数器的值变为 0.简单使用这个例子主要演示了,如何利用 CountDownLatch 去协调多个线程同时开始运行。这个时候的 CountDownLatch 中的计数器的现实含义是等待创建的线程个数,每个线程在开始任务之前都会调用 awai原创 2021-01-30 22:51:02 · 149 阅读 · 0 评论 -
Java并发编程之CAS和AQS
什么是CASCAS(compare and swap),字面意思比较并交换,是解决多线程并行情况下使用锁造成性能损耗的一种机制.public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}CAS有三个操作数,valueOffset内存值,expect期望值,update要更新的值。原创 2021-01-28 22:51:51 · 371 阅读 · 0 评论 -
Java线程池ExecutorService中重要的方法
ExecutorService 介绍ExecutorService是java线程池定义的一个接口,它在java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法。Java API对ExecutorService接口实现有两个,所以这两个即是线程池的具体实现。1. ThreadPoolExecutor2. ScheduledThreadPoolExecutorExecutorService还继承了Executor接口。实线表示继承,需要表示实现原创 2021-01-26 22:42:55 · 622 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor源码分析
继承关系Executor接口public interface Executor { void execute(Runnable command);}ExecutorService接口public interface ExecutorService extends Executor { void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); boolean原创 2021-01-25 22:31:16 · 171 阅读 · 0 评论 -
Java并发线程之线程池
初始化线程池后,把任务丢进去,等待调度就可以了,使用起来比较方便。JAVA中Thread是线程类,不建议直接使用Thread执行任务,在并发数量比较多的情况下,每个线程都是执行一个很短的时间就任务结束了,这样频繁创建线程会大大降低系统的效率,因为频繁的创建和销毁线程需要时间。而线程池可以复用,就是执行完一个任务,并不销毁,而是可以继续执行其它任务。Thread的弊端每次new Thread() 创建对象,性能差。线程缺乏统一管理,可能无限制创建线程,相互竞争,有可能占用过多系统资源导致死机或O.原创 2021-01-24 20:33:58 · 125 阅读 · 0 评论 -
Java高并发BlockingQueue重要的实现类二
DelayQueueDelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed元素。存放到DelayDeque的元素必须继承Delayed接口。Delayed接口使对象成为延迟对象,它使存放在DelayQueue类中的对象具有了激活日期,该接口强制执行下列两个方法:CompareTo(Delayed o):Delayed接口继承了Comparable接口,因此有了这个方法getDelay(TimeUnit unit):这个方法原创 2021-01-23 21:37:46 · 114 阅读 · 0 评论 -
Java高并发BlockingQueue重要的实现类
ArrayBlockingQueue有界的阻塞队列,内部是一个数组,有边界的意思是:容量是有限的,必须进行初始化,指定它的容量大小,以先进先出的方式存储数据,最新插入的在对尾,最先移除的对象在头部。public class ArrayBlockingQueue<E> extends AbstractQueue<E>implements BlockingQueue<E>, java.io.Serializable { /** 队列元素 */ fin原创 2021-01-22 23:31:50 · 148 阅读 · 0 评论 -
Java高并发之BlockingQueue
简介多线程中通过队列很容易共享数据,比如经典的生产者和消费者模型中,通过队列可以很方便的实现数据共享。假设我们有若干生产者线程,又有若干消费者线程,生产者线程可以通过队列将数据共享给消费者。但是生产者和消费者在某个时间段内,万一发生数据处理速度不匹配的情况呢?如果生产者生产数据的速度远大于消费者消费数据的速度,理想情况下是当生产者产生的数据到达一个阈值之后,那么生产者必须暂停一下(阻塞生产者线程),以便消费者可以把数据消费掉。在concurrent包出现之前,开发人员必须手动控制这些细节,导致开发高性能原创 2021-01-21 22:25:47 · 241 阅读 · 0 评论 -
Java中J.U.C扩展组件之ForkJoinTask和ForkJoinPool
Fork/Join框架中两个核心类ForkJoinTask与ForkJoinPool,声明ForkJoinTask后,将其加入ForkJoinPool中,并返回一个Future对象。ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行,任务分割的子任务会添加到当前工作维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其它工作线程的队列尾部获取一个任务。ForkJoinTask:我们需要使用ForkJoin框架,首先要创建一个.原创 2021-01-20 21:41:34 · 191 阅读 · 0 评论 -
Java中J.U.C扩展组件之Fork,join
Fork/join介绍Fork/join框架是java7提供的并行执行任务的框架,是把大任务分割成若干小任务,最后汇总若干小任务的执行结果得到最终的结果。它的思想与MapReduce类似。Fork把一个大任务分割成若干小任务,Join用于合并小任务的结果,最后得到大框架的结果。主要采取工作窃取算法。工作窃取(work-stealing)算法是指某个线程从其它队列窃取任务执行。假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务原创 2021-01-19 23:20:13 · 176 阅读 · 0 评论 -
Java同步组件之Condition,FutureTask
Java同步组件概况CountDownLatch : 是闭锁,通过一个计数来保证线程是否一直阻塞Semaphore: 控制同一时间,并发线程数量CyclicBarrier:字面意思是回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。ReentrantLock:是一个重入锁,一个线程获得了锁之后仍然可以反复加锁,不会出现自己阻塞自己的情况。Condition:配合ReentrantLock,实现等待/通知模型FutureTask:FutureTask实现了接口Future,同F原创 2021-01-18 23:34:44 · 171 阅读 · 0 评论 -
Java同步组件之CyclicBarrier,ReentrantLock
文章目录Java同步组件概况`CyclicBarrier`介绍与`CountDownLatch`比较相同点不同点`CountDownLatch`和`CyclicBarrier`的场景比较代码演示`ReentrantLock`可重入锁`ReentrantLock`(可重入锁)和`synchronized`的区别`ReentrantLock`与`synchronized`的功能区别`ReentrantLock`特有功能`synchronized`的使用场景代码演示`ReentrantLock`常用方法`Reen原创 2021-01-16 21:12:51 · 208 阅读 · 0 评论 -
Java同步组件之CountDownLatch,Semaphore
Java同步组件概况CountDownLatch : 是闭锁,通过一个计数来保证线程是否一直阻塞Semaphore: 控制同一时间,并发线程数量CyclicBarrier:字面意思是回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。ReentrantLock:是一个重入锁,一个线程获得了锁之后仍然可以反复加锁,不会出现自己阻塞自己的情况。Condition:配合ReentrantLock,实现等待/通知模型FutureTask:FutureTask实现了接口Future,同F原创 2021-01-15 22:21:15 · 235 阅读 · 0 评论 -
AQS同步队列结构分析
同步队列结构AQS使用的同步队列是基于一种CLH锁算法来实现。CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋.同步器中包含了两个节点类型的引用,一个指向头节点(head),一个指向尾节点(tail),没有获取到锁的线程,加入到队列的过程必须保证线程安全,因此同步器提供了一个基于CAS的设置尾节点的方法CompareAndSetTail(Node expect,Node update),它需要传递当前线原创 2021-01-13 22:58:31 · 232 阅读 · 0 评论 -
Java并发J.U.C 之 AQS
J.U.C 之 AQSAbStractQueuedSynchronizer类,简称AQS,是一个来构建锁和同步器的框架,JDK1.5开始引入了J.U.C,大大提高了JAVA程序的并发性,而AQS则是J.U.C的核心,是并发类中的核心部分,他是一个基于FIFO队列,这个队列可以构建锁或其它相关的同步基础框架AQS底层结构底层采用双向链表,是队列的一种实现,因此可以当做是一个队列。其中Sync queue即同步队列,它是双向链表,包括hean结点(主要用作后续的调度)与tail结点。Conditi原创 2021-01-11 22:47:24 · 94 阅读 · 0 评论 -
Java并发容器J.U.C
J.U.C是java.util.concurrent的简写,里面提供了很多线程安全的集合。CopyOnWriteArrayList介绍CopyOnWriteArrayList相比于ArrayList是线程安全的,字面意思是写操作时复制。CopyOnWriteArrayList使用写操作时复制技术,当有新元素需要加入时,先从原数组拷贝一份出来。然后在新数组里面加锁添加,添加之后,将原来数组的引用指向新数组。 public boolean add(E e) { final Reen.原创 2021-01-10 19:39:32 · 275 阅读 · 0 评论 -
Java同步容器
ArrayList,HashSet,HashMap都是线程非安全的,在多线程环境下,会导致线程安全问题,所以在使用的时候需要进行同步,这无疑增加了程序开发的难度。所以JAVA提供了同步容器。同步容器ArrayList ===> Vector,StackHashMap ===> HashTable(key,value都不能为空)Collections.synchronizedXXX(List,Set,Map)Vector实现List接口,底层和ArrayList类似,但是Vect.原创 2021-01-09 21:03:02 · 175 阅读 · 0 评论 -
JAVA日期安全格式化之SimpleDateFormat和jodaTime,DateTimeFormatter
SimpleDateFormat线程不安全的日期格式化库SimpleDateFormat是JAVA提供的一个日期转换类。package com.rumenz.task;import java.text.SimpleDateFormat;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;imp原创 2021-01-07 20:02:54 · 239 阅读 · 0 评论 -
StringBuilder与StringBuffer
StringBuilderpackage com.keytech.task;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;//线程不安全public class StringExample1 { publ原创 2021-01-06 23:19:39 · 90 阅读 · 0 评论 -
Java线程封闭
把对象封装到一个线程里,只有一个线程可以看到该对象,那么就算这个对象不是线程安全的,也不会出现任何线程问题,因为它只能在一个线程中被访问。Ad-hoc线程封闭:程序控制实现,非常脆弱,最糟糕,忽略。堆栈封闭:简单的说就是局部变量,无并发问题。多线程访问同一个方法时,方法中的局部变量会被拷贝一份到线程栈中。方法的局部变量不是被多线程共享的,不会出现线程安全问题,能用局部变量就不要用全局变量,全局变量容易发生并发问题,注意全局变量不是全局常量。ThreadLocal线程封闭:Java中提供一个Thr.原创 2021-01-05 21:43:45 · 192 阅读 · 0 评论 -
Java线程安全策略
线程安全策略创建后状态不能被修改的对象叫做不可变对象. 不可变的对象天生就是线程安全的. 不可变对象的常量(变量)是在构造函数中创建的,既然它们的状态永远无法被改变,那么它们永远就是线程安全的。不可变对象需要满足的条件对象创建以后其状态就不能修改。对象的所有域都是fina类型。对象是正确创建的(在对象创建期间,this引用没有逸出)并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了finalfinal关键字:类,方原创 2021-01-04 23:08:41 · 142 阅读 · 0 评论 -
Java安全的发布对象
安全发布对象在静态初始化函数中初始化一个对象引用将对象的引用保存到volatile类型域或者AtomicReference对象中将对象的引用保存到某个正确构造对象的final类型域中将对象的引用保存到一个由锁保护的域中Spring 框架中,Spring管理的类都是单例模式。如何保证一个实例只被初始化一次,且线程安全?通过不同单例的写法,具体描述安全发布对象的四种方法:在静态初始化函数中初始化一个对象的引用(不推荐)package com.rumenz.task.single;//原创 2021-01-03 23:33:45 · 144 阅读 · 1 评论 -
Java多线程之有序性
有序性在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响单线程执行的结果,会影响到多线程并发执行结果的正确性volatile,synchronized,Lock通过volatile,synchronized,Lock保证一定的有序性,synchronized,Lock保证每一时刻只有一个线程可以执行同步代码块,相当于让线程顺序执行同步代码,从而保证有序性。另外,JVM具备一些先天的有序性,即不需要额外的手段就能保证有序性,即Happens-before原则,如果两个操原创 2021-01-02 22:23:32 · 544 阅读 · 2 评论 -
多线程之线程可见性synchronized
synchronized的规定线程解锁前,必须把共享变量刷新到主内存线程加锁前将清空工作内存共享变量的值,需要从主存中获取共享变量的值。加锁(synchronized 同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性。我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且还希望确保当一个线程修改了对象状态后,其他线程能够看到该变化。而线程的同步恰恰也能够实现这一点。内置锁可以用于确保某个线程以一种可预测的方式来查看另一个线程的执行结果。为了确保原创 2021-01-01 22:27:57 · 153 阅读 · 0 评论 -
Java多线程之可见性之volatile
可见性一个线程对主内存的修改可以及时被其它线程观察到导致共享变量在线程间不可见的原因线程交叉执行指令重排序加上线程交叉执行共享变量更新后的值没有在工作内存与主存间及时更新保证可见性和原子性对于可见性Java提供了synchonized和volatilevolatile通过加入内存屏障和禁止重排序优化来实现,保证可见性不保证原子性对volatile变量进行写操作时,会在写操作后加入一条store屏障指令,将工作内存变量值刷新到主内存。对volatile变量进行读操作时原创 2020-12-31 23:10:35 · 125 阅读 · 0 评论