![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
丿ZhangT
这个作者很懒,什么都没留下…
展开
-
volatile关键字详解
volatile是什么?volatile是java虚拟机提供的轻量级的同步机制,volatile有三大特性:1.保证可见性2.不保证原子性3.禁止指令重排什么是可见性其实就是只要有一个线程对变量操作完成之后写回主内存其他线程立马知道研究可见性就要知道什么是JMM?JMM是什么?JMM是java内存模型,是一种抽象的概念并不真实存在,是一套或一组规范,就像中国人说我属羊就知道是什么意思。通过这组规范定义了程序中各个变量的访问方式。JMM同步的规定:线程解锁前必须把共享变量的值刷新到主原创 2020-10-05 17:39:44 · 1032 阅读 · 0 评论 -
JAVA中锁的介绍
公平锁和非公平锁公平锁:公平锁,就是很公平,在并发环境中每个线程在获取锁时首先会查看此锁维护的等待队列,如果是空说明自己是第一个就会获得到锁,如果不为空就会加入到队列中等待排队。非公平锁:非公平锁上来就尝试占有锁,如果尝试失败,才会加入到队列中。多线程获取锁并不是按照申请锁顺序,有可能后申请锁的线程比先申请锁的线程优先获取锁,有可能会造成优先级反转或者饥饿现象(等了好久都没获得到锁非常饥饿)。java.util.concurrent包中的ReentrantLock类,可以在这个类中的构造方法中传原创 2020-10-05 17:38:57 · 62 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier和Semaphore的介绍
CountDownLatch介绍CountDownLatch是java.util.concurrent包中的类。一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。其实就是一个或者多个线程等待其他线程执行完成之后自己才开始执行。例子:就像一个教室里的学生,班长要等待所有同学都出教室了,最后班长再把问锁上走人。班长就是那个一直被阻塞的线程,知道别的线程都执行完毕自己再执行。代码如下:public static void main(String[] args) th原创 2020-10-05 17:38:18 · 92 阅读 · 0 评论 -
枚举的使用
枚举的使用枚举相当于一个数据库,性能要比数据库好的多,不用建立连接释放连接之类的。枚举的应用场景,比如我想定义一个1对应燕国,2对应赵国,3对应韩国…又便于后期的修改,配置一些对象,不用配置到数据库中就可以,就可以用枚举。比如有这么一个业务场景,需要让燕国,赵国…七国都消灭了,秦国才能一统天下。枚举对象都是单例的。可以设计一个这么一个枚举:public enum enumDemo { one(1,"燕国"), two(2,"齐国"), three(3,"楚国"),原创 2020-10-05 17:37:46 · 336 阅读 · 0 评论 -
Synchronized和Lock的区别
Synchronized和Lock的区别1.原始构成Synchronized是Java中关键字属于jvm层,Synchronized底层是通过monitor对象完成的,可以用java -p命令查看汇编指令,其实wait、notify等方法也依赖于monitor对象因此可以直接this.wait调用。Lock是具体类(java.util.concurrent.Locks.Lock)属于api层。2.使用方法:Synchronized不需要我们手动释放锁,ReentrantLock需要我们手动释放锁原创 2020-10-05 17:37:09 · 259 阅读 · 0 评论 -
阻塞队列介绍
阻塞队列BlockingQueue和List接口一样,都继承Collection接口实现类:ArrayBlockingQueue:由数组结构组成的有界阻塞队列LinkedBlockingQueue:由链表结构组成的有界阻塞队列默认值是int最大值SynchronousQueue:不存储元素的阻塞队列,即单元素队列常用API抛出异常(不友好)代码如下:BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<原创 2020-10-05 17:36:24 · 122 阅读 · 0 评论 -
多线程-Callable接口
多线程的开启方式继承Thread类,实现Runnable接口,实现Callable接口。前两者是我们常见的多线程实现方式,就不详细介绍了。实现Callable接口,与前两者不同是带有返回值,在之前的单线程中,如果中间有一个任务需要计算很长时间,那么就可以另开辟一个线程去执行它,最终把结果汇总就可以了,不会阻塞线程。如下图:Callable实现方式用到了适配器模式。适配器模式就是让两个没有关系的接口,通过中间类产生关系。比如:new Thread();我们都知道需要在构造里面传一个Runna原创 2020-09-26 17:42:23 · 173 阅读 · 0 评论 -
线程池的介绍
线程池的优势1、降低资源消耗。通过重复利用已创建的线程降低创建和销毁造成的消耗。2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。3、提高线程的可管理性。线程是稀缺资源,如果无限的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配。总结:线程复用、控制并发数、管理线程线程池的使用数组 Array 数组工具类:Arrays集合 Collection 集合工具类:Collections线程 Executor 线程工具类:Executor原创 2020-09-26 17:41:43 · 128 阅读 · 0 评论 -
可预知的异常处理和不可预知的异常处理
异常的处理流程1、自定义异常类型。2、自定义错误代码及错误信息。3、对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。4、对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类原创 2020-09-23 20:44:58 · 809 阅读 · 0 评论 -
一个接口被多个实现类实现,如何判定调用接口中的方法到底是执行哪个实现类方法
1、 直接new一个实例,这样肯定知道用的哪个实例 2、 定义接口类型的变量,用某个实例去初始化。。。这样也是肯定知道用的哪个实例3、用反射创建实现类或者实现类的子类对象,强转成接口类型ICar iCar = (ICar) ServiceAnnotationSupport.serviceInjection(Class.forName("com.test.AodiCarPlus"));iCar.run();...原创 2020-09-22 20:01:29 · 3734 阅读 · 0 评论 -
解决Request.getParameter取不到特殊字符bug
今天系统之间联调,发现对端平台发过来的json串,到我们系统获取不到,经过排查是因为对端系统发起的json串中有"#"这类特殊字符,我们用request.getparamter获取不到。解决办法:如果是前端发送的要用encodeURI编码,编码之后我们用request.getparamter就可以获取到了,然后后端用URLDecoder.decode(加密串) 解密。如果是后端发送URLEncoder.encode(要加密的串)加密。使用URLDecoder.decode(加密串) 解密还有个好处就原创 2020-09-22 20:00:31 · 1768 阅读 · 0 评论