java基础
卡尔非得
这个作者很懒,什么都没留下…
展开
-
事务
事务的ACID特性事务的隔离级别:读未提交、读已提交、可重复读、串行化。Spring中事务有相应的传播机制,一般按照具体的业务来使用一些事务传播机制。Spring当中有声明式事务和编程式事务。Spring事务相关运用到比较多的就是@Transactional的注解声明式事务的处理。最常用的是传播机制是propagation_required。如果存在事务,则支持事务。@Transactional一般作用于方法之上,底层也是使用AOP对方法进行一个增强。...原创 2021-02-27 13:55:07 · 61 阅读 · 0 评论 -
权限框架SpringSecurity
SpringSecurity权限管理的框架,用户对应了角色,而角色会有一些权限。可以对一些用户请求做拦截,在配置类中添加基于内存的角色权限,通过表单的验证,就可以完成这个请求。同时可以对角色进行拦截,具体方法就是在注解中添加hasRole方法,意思就是如果有这个角色,那么就不会对相关请求做拦截。...原创 2021-02-27 13:54:05 · 123 阅读 · 0 评论 -
阻塞队列
ArrayBlockingQueue1.数据结构:数组 必须指定相关长度,没有扩容机制。2.使用的是ReentrantLock+Condition来实现锁机制,锁住的是整个数组对象3.发生阻塞有两个条件notEmpty 出队的时候,当没有元素可以读取的时候,阻塞该队列。notFull 入队的时候,队列元素已满,阻塞该队列。4.先进先出,读写互相不排斥5.入队时,会唤醒notEmpty;出队时,会唤醒notFull。LinkedBlockingQueue1.数据结构:链表 可原创 2021-02-09 15:29:37 · 74 阅读 · 0 评论 -
悲观锁和乐观锁
悲观锁synchronized锁住的方法或者代码块具有原子性。ReentRantLock+condition搭配使用能够唤醒指定线程乐观锁Cas+自旋Cas,即比较和替换,java很多并发包中有许多实现的底层原理都是cas.区别于synchronized同步锁悲观锁的一种乐观锁。其中的比较和交换是通过使用操作系统中的指令来保证原子性。功能就是先判断内存中的值是否为预期值,如果为是就改变成新的值,整个过程都是具有原子性的。应用的具体同步包就是Atomic,Unsafe类优点:不需要用锁来让线程原创 2021-02-09 15:28:57 · 108 阅读 · 0 评论 -
Semaphore
Semaphore的理解Semaphore可以用于控制同时访问特定资源的线程数量。保证合理的利用资源。通常使用Semaphore来进行限流。使用场景:明确有资源访问限制的场景。semaphore.acquire();//获取许可semaphore.release();//释放public class ConcurrentSemphore { public static void main(String[] args) { //创建三个信号量,表示同一时间只能最多有三个线程去抢占同一个资源原创 2021-02-07 11:07:30 · 135 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier
CountDownLatch和CyclicBarrierCountDownLatch计数器本质上是通过一个计数器来实现的。计数器的初始值就是线程的数量,每当一个线程执行完毕的时候,计数器的数量就会减1,当计数器的数值为0时,表示所有的线程执行完毕,则会唤醒再countDownLatch上等待的线程。典型的例子就是主线程等待子线程们全部执行完毕。CyclicBarrier栅栏,等待所有的线程都到达屏障时,然后各个线程从而获取锁,释放锁。里面也有一个计数器,每当一个线程到达屏障点的时候都会调用awai原创 2021-02-06 16:41:27 · 84 阅读 · 0 评论 -
ConcurrentHashMap总结
为什么要使用ConcurrentHashMap原因:线程不安全的HashMap,在多线程的情况下,数组扩容时,会导致链表出现死循环问题,导致线程不安全。解决HashMap链表死循环有三种方法:1.Collection.synchronized*(m)将线程不安全的集合变为线程安全的结合。里面定义了一个对象锁来保护线程安全,将该对象转换为同步对象,不能改变对象的类型性质。2.使用HashTable3.concurrentHashMap采用分段锁的方式来提高并发访问的效率。但是效率低下的HashTa原创 2021-02-06 16:38:34 · 241 阅读 · 1 评论 -
线程安全的集合
Java.util包下面那些关于线程安全的工具类:1.Vector线程安全的集合。是一种特殊的线性表。插入、删除、访问都发生在栈顶。查询快、增删慢。其中它的每一个方法都会有synchronized来进行修饰。2.HashTable是线程安全的,其中HashTable中的key值和value值都不能为空,而HashMap中是key和value值是可以为空的。其中HashTable中的方法有synchronized修饰。...原创 2021-02-06 16:32:44 · 1038 阅读 · 0 评论 -
Session和Cookie的区别
Session和Cookie的区别Session是服务器端用来识别用户信息的一种数据结构。这个数据一般存放在服务器集群,数据库或者文件中。Cookie是浏览器端用来存储用户信息的一种数据结构,用来保存用户的信息,是实现Session的一种方式。Session的运行依靠session_id,session_id存放于cookie之中,方便于服务器给用户端提供动态的推荐服务。Session相比于cookie更加的安全。...原创 2021-01-29 11:07:58 · 59 阅读 · 0 评论 -
Get和Post的区别
Get和Post的区别1.Get的请求参数在URL中,而Post的请求参数在RequestBody中。2.Get对于服务器的请求会把http header和data一起发送到服务器,然后服务器返回200;而post先会发送http header,服务器会相应100 continue,浏览器再发送data,服务器返回200.所以post要走两步。Get只要走一步。3.对于请求参数的参数类型。Get只接受Ascll字符,而Post没有限制。4.Get相比于post更为不安全。...原创 2021-01-29 11:06:42 · 60 阅读 · 0 评论 -
mybaties的#{}和${}有什么区别?
mybaties的#{}和${}有什么区别?mybaits在处理#{}符号时,会进行预编译处理,将#{}转换成?,在预编译结束后,可以通过PreparedStatement中的set方法进行赋值。防止了sql的注入。避免了用户在预编译阶段使用非法字符产生的潜在的安全性问题。处理${}就是字符串的替换。不安全。...原创 2021-01-26 14:19:33 · 421 阅读 · 0 评论 -
关于socket
socket网络通信Java支持关于流的通信。Java支持SocketServer来创建服务器端的套接字,支持Socket来创建客户端的套接字。服务器和客户端通过套接字来进行连接,i/o流来进行数据通信。//创建服务器端的套接字来等待客户端的连接。ServerSocket serversocket =new ServerSocket(post);Server server=serversocket.accept();//客户端套接字Server server=new Server(servern原创 2021-01-25 17:58:42 · 114 阅读 · 0 评论 -
线程的生命周期
线程的生命周期线程的生命周期包括五个阶段新建:使用new关键字刚创建出来的线程。就绪:调用了.start()方法的线程,处于就绪状态,等待cpu时间片的分配。运行:获取了时间片并处于运行状态。阻塞:同步阻塞:等待其他线程执行完成后才能获取cpu时间片并执行。Join()睡眠阻塞:线程调用sleep()方法进行睡眠,不会释放锁。等待阻塞:wait()进行等待被唤醒,重新获取锁和相关灵界资源。结束:程序正常结束或者抛出异常或者强制停止的一种状态。...原创 2021-01-25 15:49:10 · 88 阅读 · 0 评论 -
String StringBuffer StringBuilder三者之间的区别
String StringBuffer StringBuilder三者之间的区别String的值是不可以被改变的。对string值做出的修改都会导致开辟新的内存空间。StringBuffer和StringBulider可以对其对象产生的字符串进行修改。其中StringBuffer线程安全,而StringBuilder线程不安全,StringBuffer适用于多线程字符串操作,它的公共方法都是用synchronized修饰的。StringBuilder对方法没有加锁同步,StringBuilder的执行原创 2021-01-23 15:56:14 · 60 阅读 · 0 评论 -
面试官常问:创建线程的几种方式
创建线程的方式1.通过继承Thread类,调用start方法创建一个新的线程2.实现Runnable接口,重写其中的run方法,实例化一个Thread,然后调用start方法。3.通过实现Callable接口,重写call()方法,并且有返回值,然后创建FutureTask任务对象放入到线程中,最后调用start方法4.创建线程池,来调用相关方法针对实现了Callable和Runable接口的任务来创建线程。最后关闭线程池。...原创 2021-01-23 15:53:55 · 137 阅读 · 0 评论 -
线程池
线程池1.线程池的目的:减少创建和销毁线程的开销,提高线程资源利用率;提高响应的速度。2.线程池的七大参数:核心进程数、最大进程数、多余线程存活时间、时间单位、阻塞队列类型、处理线程的工厂ThreadFactory、拒绝策略其中拒绝策略的情况,表示队列和线程池都满了的情况,对任务采取的一种策略:1.直接抛出异常2.不处理,丢弃掉3.用调用者所在的线程来处理当前任务4.丢弃队列里面最近的一个任务,并执行当前任务3.Java可以通过Executors类来创建四种线程:(1)newCache原创 2021-01-21 10:28:38 · 65 阅读 · 0 评论 -
ThreadLocal的理解
ThreadLocal本地线程变量。解决多个线程对一个公共变量进行操作时导致的线程不安全的情况,使得每个线程都会有一个该变量的副本,然后同一个线程多个方法共享的一个变量。ThreadLocal类型的本地变量是存放在具体的线程空间上,牺牲了空间来换取同步。维护了一个map,key就是当前的线程,value时线程变量的具体值。...原创 2021-01-21 10:17:42 · 64 阅读 · 0 评论 -
生产者和消费者的理解
生产者和消费者用ReentrantLock+Condtion来实现首先创建线程池来创建两个线程,然后分配相应的任务,生产者线程负责生产,消费者线程负责消费。为了让生产者和消费者之间解耦,有相关队列进行数据的存放。当队列为空或者满的时候,消费者/生产者线程等待,并且释放锁,自己处于等待状态。当队列中添加或者减少一个资源的时候,消费者/生产者线程会被唤醒,同时放弃锁,自己处于等待状态。代码可以通过synchronized来锁着相应的队列对象,或者使用ReentrantLock+Condtion来进行操作。原创 2021-01-20 13:44:17 · 1080 阅读 · 2 评论 -
ReentrantLock
ReentrantLock同步代码块synchronized加锁和解锁都是自动进行的,不必担心锁是否已经释放,而ReentrantLock需要手动来创建和释放锁。 ReentrantLock和synchronized主要功能都是用作与同步代码块。应用场景例如生产者消费者模型使用ReentrantLock+Condtion。运用ReentRantLock来同步代码块:import java.util.concurrent.locks.*;public class TestTicketRunnable原创 2021-01-20 13:06:13 · 57 阅读 · 0 评论 -
synchronized
synchronized实现线程间同步的方式有两种:①使用synchronized同步代码块;②使用synchronized关键字创建synchronized()方法synchronized(this)、synchronized(test.class)、public static synchronized void method(){…}三种方式都是一样的。静态方法是被所有实例对象共享的,所以给静态方法加锁,会被视为给类加锁。推荐使用synchronized同步代码块synchronized原创 2021-01-19 15:52:36 · 164 阅读 · 2 评论 -
单例模式
单例模式单例模式:一个类只能创建一个对象的模式单例模式代码:public class Singleton { private Singleton() {} private volatile static Singleton instance=null; private static Singleton getInstance() { if(instance==null) synchronized (Singleton.class) { if(instance原创 2021-01-19 10:59:21 · 68 阅读 · 0 评论 -
栈和队列的基本性质
栈和队列的基本性质栈是一种特殊类型的线性表,访问、插入、删除只能发生在栈顶。Vector继承自List类,所以里面有实现相关的接口,stack类是其中的一个实现类。peek()返回栈顶元素,push()压入栈,pop()删除栈顶元素并且返回。队列是一种 FIFO先进先出的数据结构。元素被追加到队列的末尾,从头部进行删除。poll()删除并且获取对头元素,remove()删除并且返回对头元素,offer()从队尾进行插入元素Deque是继承自Quque可以支持从两端插入和删除元素。...原创 2021-01-18 11:34:32 · 1252 阅读 · 0 评论 -
kmp算法
kmp算法的思想kmp算法的主要思想:围绕模式串创建一个next数组,当模式串与主串依次比较到不匹配的字符时,会到next数组中找到与主串比较的具体位置。也就是说对于每一个位置不匹配的情况,统计字符串具体位置前缀和后缀最长的公共部分,确定一个具体位置与主串的比较。通过计算之前匹配过的位置,节省重复匹配的时间。时间复杂度可以达到o(m+n)。...原创 2021-01-17 13:21:16 · 69 阅读 · 0 评论 -
图的遍历
图的遍历的两种方式以及主要的算法思想深度优先遍历和广度优先遍历深度优先遍历的算法思想:深度优先遍历是一个递归的过程,搭配栈来实现它的思想。首先选取一个节点进行遍历,选取邻接节点未被访问的节点进行前进访问,若不能前进,则进行回退到前一步的位置继续进行前进,直到回退到起始节点,则图的每个节点都会被遍历。广度优先遍历的算法思想:广度优先搜索类似于树的层次遍历,是按照一种由近及远的方式访问图的顶点。附:树的遍历:前序遍历、中序遍历、后序遍历、层次遍历前序遍历:从根节点依次先遍历它的左子树,再遍历他的右原创 2021-01-17 10:45:00 · 165 阅读 · 0 评论 -
java的反射机制
反射机制获取class类的三个方式1)new一个对象出来,然后调用getClass()方法就可以创建对应的class对象。Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。Class stuClass = stu1.getClass();//获取Class对象2)需要导入相应的包,依赖性太强//第二种方式获取Class对象Class stuClass2 = Student.class;3)class的forName()方原创 2021-01-14 14:17:56 · 68 阅读 · 0 评论 -
关于重载与重写的区别
重载与重写重载:一个类中的多个方法,方法名相同,参数个数、次序、类型不同其中返回值可以相同也可以不同,返回值类型不同的前提是方法名相同,参数个数、次序、类型不同。且同一方法内的几个参数类型必须不一样重写:一般用于子类和父类之间,继承父类方法并且重写,方法名、参数、返回值相同。子类方法不能缩小父类方法的访问权限。子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。方法被定义为final不能被重写。...原创 2021-01-13 17:10:10 · 144 阅读 · 0 评论 -
红黑树的基本理解
红黑树红黑树是一种自平衡的二叉查找树性质:1) 节点是红色或者黑色2) 根节点为黑色3) 每个红色节点的叶子节点都是黑色4) 每个叶子节点都是黑色5) 每个节点到叶子节点的所有路径中包含相同数目的黑色节点数6) 红黑树从根节点到叶子节点的最长路径不会超过最短路劲的2倍红黑树和AVL树的区别:红黑树只追求大致的平衡,根节点到子节点的最长路径不会超过最短路劲的两倍,而平衡二叉树左右子树的高度差不能超过1;其中平衡二叉树插入删除的代价比红黑树高,不适合插入、删除较多的场景,红黑树插入删除的时候原创 2021-01-13 14:52:17 · 144 阅读 · 0 评论 -
java中四种访问范围
java中四种访问范围1.private被其修饰的属性与方法只能被该类的对象所访问,其子类不能访问,更不允许跨包访问。(本类)2.Default只允许同一个包进行访问(本包,本类)3.Protected其修饰的属性和方法只能被该类自身或者其子类进行访问,运行子类跨包进行访问(本包,子类,本类)4.Public不同包的非子类也可以访问。注意:一般来说 private和protect不能用来修饰类...原创 2021-01-12 10:59:15 · 1135 阅读 · 0 评论