ThreadPoolExecutor-线程池的理解 1.再说线程池之前先了解下线程、用户级线程、内核级线程概念线程可以通过继承Thread,实现Runnable接口以及实现Callable接口来创建线程,它是比进程更小执行单位。 线程的生命周期和状态 用户级线程: 用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,...
ThreadLocal理解 1.ThreadLocal的类层级结构2.ThreadLocal作用ThreadLocal修饰的变量:使得每个线程都拥有该变量的本地副本。(你有你的,我有我的,你修改你的并不会影响我的变量的值)3.ThreadLocal使用场景适用于高并发场景下,各个线程通过不同变量值完成操作的场景。4.源码解析set(T value) get() remove()...
volatile关键字理解 1.JMM层面 每个线程从主内存中读取数据,读入自己的本地工作内存进行相应的修改,每个线程的本地工作内存相互独立的。因此这就可能造成一个线程读取内存的数据进行的相应的修改,但是没有及时的写入内存,造成其他线程读取到过时的数据,因此有数据不一致性问题。为了解决这个问题,我们可以使用volatile来定义该变量。2.特性可见性:一个线程修改了全局变量的值以后,其他线程也可见。实现机制是通...
Java关键字-synchronized理解 1.作用及版本多线程环境下用来控制资源同步访问的,同步控制的代码块是原子操作。 JDK1.6以前的synchronized是一把重量级锁,监视器锁(monitor),当一个线程获取到锁之后,其他线程想要获取锁就必须等待,也就是其他线程是阻塞状态(Blocked)。当前线程获取到锁执行完之后释放锁,这时阻塞队列里面的线程会去竞争锁,竞争到锁的线程又继续执行。由于这个时候发生了线程切换,因此...
JDK1.8-ArrayList-add/get/remove 源码流程解析 1.add(E e)2.get(int index)3.remove(Object o)4.安全性:ArrayList由于没有加同步和任何的锁机制,因此不是线程安全的。可能出现数组越界或者脏读等问题。想要线程安全可以使用Vector。5. remove(Object o)和remove(int index)区别:remove(Object o)返回true/fals...
JDK1.8-HashMap get/remove 操作流程解析 1. get(Object key)注意:如果Node数组不空的话,它每次都会去取数组第一个元素,看该元素的key以及key生成的hashCode值是否和传过去的Object key以及key生成的hash值是否分别对应相等,如果是的话,直接返回Node数组第一个元素,返回其value值。否则根据上图往下走。2.remove(Object key)...
JDK1.8-HashMap-Put操作源码流程解析 1.Put 操作流程图2.当put操作发生hash冲突的时候,会用拉链法解决冲突。但是如果在同一内存地址冲突的数据超过8个时,并且这个时候Node数组的容量大于等于64,那么这个时候再在该位置添加元素会把单链表变成双向链表最后再转换成红黑树来进行存储数据。采用红黑树存储数据目的是在该冲突的地址查询数据的时候能够更快,提高查询效率。存储结构转换图:3.红黑树为了保证其特定,在插入元...
JDK1.8-ReentrantLock.lockInterruptibly流程分析 1.ReentrantLock.lockInterruptibly流程图2. 注意该方法说明ReentrantLock是可中断锁,被中断后可以调用某个线程的是否中断方法(t1.isInterrupted)来确认该线程是否被中断。3.线程被中断后会报InterruptedException,我们可以捕获该异常,之后再做相应的业务逻辑处理。...
JDK1.8-ReentrantLock解锁过程 ReentrantLock解锁流程图实例代码package com.sap.leo.test;import com.sun.xml.internal.bind.v2.model.annotation.RuntimeAnnotationReader;import jdk.nashorn.internal.ir.Block;import java.util.concurrent....
JDK1.8-ReenrantLock 加锁过程 ReenrantLock 加锁过程流程图以及AQS队列入队情况2.公平锁与非公平锁区别非公平锁: 当锁释放的时候,获取锁的线程会和队列中第一个线程竞争锁资源,但是已经在队列中的线程还是按照先进先出的顺序去获取锁。 公平锁: 当锁释放的时候,队列中第一个线程会去获取锁资源。3.队列中元素如何出队?当t1释放资源,t2如果获取到锁,那么会把t2之前结点的指针都断开,让GC回收该结点...
Java-伪代码实现一把锁 1.多线程情况下自己手动模拟实现一把锁(伪代码)Version1.0:自旋 volatile int status = 0; //是否有线程获取到锁,0表示没有//主业务流程public static void testSync(){ thread.lock(); //当前线程尝试获取锁 ... //获取到锁之后处理业务逻辑 thread.unlock(); //...
创建Entity,由于级联关系导致显示的时候会有n层嵌套问题 1.问题现象CustomerAttribute和CustomerAttributeText表,是1对N的关系,在保存CustomerAttribute的时候,把保存的结果返回给前台,会出现n层嵌套的问题。2.原因:级联导致3.解决方案:返回的数据不要直接返回CustomerAttribute,用dto去接,这样就没有级联n层问题...
删除表提示:外键关联错误解决 1.有两张表CustomerAttribute,CustomerAttributeTextCustomerAttribute结构:GUID(主键),Name,DataType,Code. CustomerAttributeText结构:GUID(主键),AttributeGuid(CustomerAttribute主键),Language,Name2.直接用sql语句删除CustomerA...
通过反射获取Entity的数据 应用场景:有些时候SQL比较难拼接(比如说:不确定通过哪个字段获取数据),这个时候我们可以利用java反射来获取数据1.Entity 实体类:@Entity@Table(name = EntitlementDbConstants.CUSTOMER_MASTER_DATA_VIEW)public abstract class CustomerMasterDataView{ p...
Spring Data Jpa @Version字段理解 Reference:https://blog.csdn.net/topdeveloperr/article/details/86496113https://juejin.im/post/5b55b842f265da0f9e589e79#comment
SimpleDateFormat 全局变量在多线程环境中会出现线程安全问题 1.代码片段/** * Project Name:JVM * File Name:TestLeo.java * Description: TODO * Copyright: Copyright (c) 2017 * Company:SAP * * @author SAP * @date May 17, 2019 11:28:44 AM * @version *...
生成Excel,处理CSV Injection 1.问题原因:我们在界面填写好数据之后并生成excel,如果数据中是以"=+-@"开头,那么在我们Excel里面显示的时候会出现CSV Injection问题。2.如何解决:2.1解决思路:首先生成Excel的workbook,之后再遍历这个workbook,如果遇到以这些特殊字符开头的数据,那么把这些数据拿到之后,在其前面加一个TAB键。3.核心代码:import org.apa...
Java_多线程模拟死锁过程 1.需求:通过Java程序来模拟死锁过程,之后通过Jconsole和Jstack分析死锁原因新起两个线程,互相拿着一个零界资源不放,并且又在请求一个新的资源,DeadLock1拿着obj1,想要obj2,DeadLock1拿着obj2,想要obj1,进而造成死锁。2.程序代碼/** * Project Name:JVM * File Name:JconsoleTest.jav...