Java
文章平均质量分 66
java 基础相关
xyz
好记性不如烂笔头,DevOps这个Flag一定要立稳呀!
展开
-
JVM 运行时数据区-JVM五大区域,GC垃圾回收算法
五大区域:1)程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;(私有)2)Java 虚拟机栈(栈)(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;(私有)3)本地方法栈(Native Method Stack):与虚拟...转载 2021-07-27 16:52:58 · 157 阅读 · 0 评论 -
多线程共同操初始化一个类,clinit方法会对静态资源加锁
当连个线程里的调用同一个类的创建实例,jvm的类加载器会保证静态资源只被加载一次(使用同一个类加载器的前提下),如果static代码块里写入一个死循环,则后一个被调用的线程会进入无限等待阶段public class Test{static{int i=0;while(true){Thread.sleep(1000); sout(i++);}}p...翻译 2021-07-18 11:22:27 · 223 阅读 · 0 评论 -
java synchronized 原理_Java基础-Synchronized原理
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。CAS(Compare and Swap),用于在硬件层面上提供原子性操作,在Intel处理器中,比较并交换通过指令cmpxchg实现。比较是否和给定的数值一致,如果一致则修改,不一致则不修改基础Java中的每一个对象都可以作为锁。对于同步方法,锁是当前实例对象。对于静态同步方法,锁转载 2021-07-07 22:53:29 · 53 阅读 · 0 评论 -
多线程死锁的产生以及如何避免死锁
一、死锁的定义多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题–死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程将无法向前推进。下面我们通过一些实例来说明死锁现象先看生活中的一个实例:2个人一起吃饭但只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时刻,一个拿了左筷子,另一个拿了右筷子,2个人都同时占用一个资源,等待另一个资源,这个时候甲在等待乙吃完并释放它占有的筷子,同理,乙也在等待甲吃完释放它占有的转载 2021-07-07 21:55:32 · 1607 阅读 · 0 评论 -
ReentrantLock(重入锁)功能详解和应用演示
例子public class ReentrantLockTest { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); for (int i = 1; i <= 3; i++) { lock.lock(); } for(int转载 2021-07-07 21:46:02 · 802 阅读 · 0 评论 -
volatile底层原理详解
文章目录:一、volatile的作用1.1、volatile变量的可见性1.2、volatile变量的禁止指令重排序二、volatile的的底层实现2.1、 Java代码层面2.2、字节码层面2.3、JVM源码层面2.4、汇编层面2.5、硬件层面volatile关键字是Java虚拟机提供的最轻量级的同步机制。在多线程编程中volatile和synchronized都起着举足轻重的作用,没有这两者,也就没有那么多JUC供我们使用。本文会介绍volatile的作用,着重讲解volatile的底层实现转载 2021-07-07 21:36:39 · 467 阅读 · 0 评论 -
Java Spring Interceptor与Filter的区别
Filter#Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集 控制权限 控制转向 业务逻辑判断工作流程#在web.xml文件配置好要拦截的客户端请求,拦截请求对请求或响应(Request、Response)统一设置编码,简化操作进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作将请求交给Servlet进行处理并生成响应最后Filter再对服务器响应进行后处理生命周期#它是随转载 2021-07-07 21:29:02 · 111 阅读 · 0 评论 -
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
一、引言本来想记录一下关于用户登陆和登陆之后的权限管理、菜单管理的问题,想到解决这个问题用到Interceptor,但想到了Interceptor,就想到了Filter,于是就想说一下它们的执行顺序和区别。关于Interceptor解决权限和菜单管理的问题,在放在下一篇写吧,就酱紫。二、区别1、过滤器(Filter)首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题:<span style="color:rgba(...转载 2021-07-07 21:29:24 · 88 阅读 · 0 评论 -
Java 同步方法和同步块,哪个是更好的选择
不太同意这一说法。 到底应该用同步块,同步方法完全取决于你的业务逻辑。 同步方法相当于锁了this,范围是整个方法。当你的业务不需要这么做或者不能这么做时,那就用同步块锁适当的对像。 换句话说,你把同步方法理解成同步块的简单写法就是了,业务上可以简单,那就简单点写。同步方法和同步代码块class Test{//同步方法 synchronizedmethod(){ //todo somthing }method2(){//同步代码块 ...转载 2021-07-06 00:20:26 · 596 阅读 · 0 评论 -
Spring框架IOC和AOP介绍
说明:本文部分内容参考其他优秀博客后结合自己实战例子改编如下Spring框架是个轻量级的Java EE框架。所谓轻量级,是指不依赖于容器就能运行的。Struts、Hibernate也是轻量级的。轻量级框架是相对于重量级框架而言的,重量级框架必须依赖特定的容器,例如EJB框架就必须运行在Glassfish、JBoss等支持EJB的容器中,而不能运行在Tomcat中。——《Java Web整合开发 王者归来》Spring以IoC、AOP为主要思想,其中IoC,Inversion of Contr..转载 2021-07-06 00:18:51 · 215 阅读 · 0 评论 -
聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)
索引的重要性数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义。聚簇索引(Clustered Index)和非聚簇索引(Non- Clustered Index)最通俗的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的索引顺序与数据物理排列顺序无关。举例来说,你翻到新华字典的汉字“爬”那一页就是P开头的部分,这就是物理存储顺序(聚簇索引);而不用你到目录,找到汉字“爬”所在的页码,然后根据页码找到这个字(非聚簇索引)。聚簇索引的唯一性正式聚簇索.转载 2021-07-06 00:16:56 · 428 阅读 · 0 评论 -
如何设计一个高并发的存储系统
1. 如何设计一个高并发的系统① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化② 使用缓存,尽量减少数据库 IO③ 分布式数据库、分布式缓存④ 服务器的负载均衡2. 锁的优化策略① 读写分离② 分段加锁③ 减少锁持有的时间④ 多个线程尽量以相同的顺序去获取资源等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久3. 索引的底层实现原理和优化转载 2021-07-06 00:15:27 · 457 阅读 · 0 评论 -
MySql 优化技巧
第一方面:30种mysql优化sql语句查询的方法1.对查询进行优化,应尽量避免全表扫描首先应考虑在 where 及 order by涉及的列上建立索引。2.应尽量避免在 where 子句中使用 !=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在 where 子句中对字段进行 null 值 判断否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num.转载 2021-07-06 00:15:35 · 94 阅读 · 0 评论 -
mysql索引 多个单列索引和联合索引的区别
mysql索引 多个单列索引和联合索引的区别详解背景:为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。一、联合索引测试注:Mysql版本为 5.7.20创建测试表(表记录数为63188):CREATE TABLE `t_mobilesms_11` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`userId`...转载 2021-07-07 21:37:06 · 400 阅读 · 0 评论 -
如何检测MySQL是否命中索引?
在日常工作中,我们有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,此时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。(QEP:sql生成一个执行计划query Execution plan)mysql> explain select *转载 2021-07-07 21:37:23 · 6917 阅读 · 0 评论 -
解布隆过滤器的原理,使用场景和注意事项
在进入正文之前,之前看到的有句话我觉得说得很好:Data structures are nothing different. They are like the bookshelves of your application where you can organize your data. Different data structures will give you different facility and benefits. To properly use the power and acce转载 2021-07-06 00:18:07 · 53 阅读 · 0 评论 -
Redis使用总结(一、几点使用心得)
本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题1、为什么使用redis分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这转载 2021-07-06 00:17:30 · 236 阅读 · 0 评论 -
三连问:MySQL如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题
事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读的?为什么会出现幻读?是否解决了幻读的问题?一、事务的隔离级别Read Uncommitted(未提交读)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)。该级别用的很少。Read Committed(提交读)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变,换句话说就转载 2021-07-06 00:17:52 · 692 阅读 · 0 评论 -
Java Proxy和CGLIB动态代理原理
发现Java面试很喜欢问Spring AOP怎么实现的之类的问题,所以写一篇文章来整理一下。关于AOP和代理模式的概念这里并不做赘述,而是直奔主题,即AOP的实现方式:动态代理。与静态代理对比,动态代理是在runtime动态生成Java代理类,由代理类完成对具体方法的封装,实现AOP的功能。本文将分析Java中两种动态代理的实现方式,jdk proxy和cglib,比较它们的异同。本文并不会过多地分析jdk和cglib的源码去探究底层的实现细节,而只关注最后生成的代理类应该是什么样的,如何实现代理。只是转载 2021-07-06 00:18:20 · 244 阅读 · 0 评论 -
Java Timer类与Runnable之间的关系
java.util.Timer 是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。Timer 类可以用安排一次性任务或者周期任务。java.util.TimerTask 是一个实现了 Runnable 接口的抽象类,我们需要去继承这个类来创建我们自己的定时任务并使用Timer 去安排它的执行。...原创 2021-07-07 21:37:49 · 244 阅读 · 0 评论 -
Java synchronized 和ReentrantLock 的区别
在JAVA多线程编程中,将需要并发执行的代码放在Thread类的run方法里面,然后创建多个Thread类的对象,调用start()方法,线程启动执行。当某段代码需要互斥时,可以用 synchronized 关键字修饰,这里讨论 synchronized 关键字修饰方法时,是如何互斥的。synchronized 修饰方法时锁定的是调用该方法的对象。它并不能使调用该方法的多个对象在执行顺序上互斥。下面举个具体的例子说明:Test.java 通过 implements Runnable 成为一个转载 2021-07-06 00:19:18 · 112 阅读 · 0 评论 -
为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object类里
关于wait()、notify()的使用public class WaitDemo { public static Object object = new Object(); public static void main(String[] args) throws InterruptedException { Thread1 thread1 = new Thread1(); Thread2 thread2 = new Thread2(); ...转载 2021-07-06 00:21:45 · 343 阅读 · 0 评论 -
Java synchronized 和volatile 同步关键字对比
Java内存模型(JMM)提到这两个有关于线程的关键字,那么我们不得不提到Java的内存模型了(JMM),下面我们先看一下Java内存模型在处理多线程方面的工作原理图。Java内存模型(java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。首先介绍两个概念可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变转载 2021-07-06 00:20:36 · 183 阅读 · 0 评论 -
java 中多线程并发ConcurrentHashMap总结
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响,无论对于Java并发编程的学习还是Java内转载 2021-07-06 00:19:38 · 1437 阅读 · 0 评论 -
Thread 类中的 yield 方法有什么作用?
使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。当前线程到了就绪状态,那么接下来哪个线程会从就绪状态变成执行状态呢?可能是当前线程,也可能是其他线程,看系统的分配了。...原创 2021-07-06 00:19:47 · 344 阅读 · 0 评论 -
Java 线程状态有哪些?
线程状态有 5 种,新建,就绪,运行,阻塞,死亡。关系图如下:1. 线程 start 方法执行后,并不表示该线程运行了,而是进入就绪状态,意思是随时准备运行,但是真正何时运行,是由操作系统决定的,代码并不能控制,2. 同样的,从运行状态的线程,也可能由于失去了 CPU 资源,回到就绪状态,也是由操作系统决定的。这一步中,也可以由程序主动失去 CPU 资源,只需调用 yield 方法。3. 线程运行完毕,或者运行了一半异常了,或者主动调用线程的 stop 方法,那么就进入死亡。死亡的线程不转载 2021-07-06 00:20:52 · 80 阅读 · 0 评论 -
java holdsLock()方法检测一个线程是否拥有锁
ava.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁Object o = new Object();@Testpublic void test1() throws Exception { new Thread(new Runnable() { @Override public void run() { synchronized(o) { ...转载 2021-07-06 00:20:58 · 434 阅读 · 0 评论 -
java中的同步集合与并发集合
同步集合可以简单地理解为通过synchronized来实现同步的集合。如果有多个线程调用同步集合的方法,它们将会串行执行。arrayList和vector、stack:1. Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比2. ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍3. Vector可以设转载 2021-07-06 00:21:14 · 107 阅读 · 0 评论 -
Java wait和notify为什么必须在同步块中
我们知道java的Object有wait和notify方法,如果要使用wait和notify的话,那么必须在synchronized块中,否则会抛出IllegalMonitorStateException。但是为什么必须在同步块中调用呢?直接wait,然后在notify不行吗?我一直存在这样的疑问,只到后来查到了Stack Overflow的一个回答,豁然开朗。大概翻译了下:假设我们要自定义一个blocking queue,如果没有使用synchronized的话,我们可能会这样写:class B转载 2021-07-06 00:21:51 · 300 阅读 · 0 评论 -
为什么java不推荐使用vector?
Vector因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer,同时只能在尾部进行插入和删除操作,更加造成效率低; Vector空间满了之后,扩容是一倍,而ArrayList仅仅是一半; Vector分配内存的时候需要连续的存储空间,如果数据太多,容易分配内存失败;不推荐还存在的理由:Vector是JDK1.0中给出的类,不能站在现在的角度思考历史遗留的问题,Vector在没有出现更好的替代之前,也是最好的。而JDK要保持向下兼容,避免老旧项目出现问题,所以会有转载 2021-07-06 00:22:19 · 2094 阅读 · 1 评论 -
Java StringBuilder 和StringBuffer 和 String之间的区别
1、三者在执行速度方面的比较:StringBuilder >StringBuffer > StringString <(StringBuffer,StringBuilder)的原因String:字符串常量StringBuffer:字符串变量StringBuilder:字符串变量从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。2、StringBuffer/StringBuilder是生产这个商品的流水线,StringBuffer速度慢,但..转载 2021-07-06 00:22:34 · 95 阅读 · 0 评论 -
Java CopyOnWriteArrayList
一、简介1、ArrayList非线程安全的缺陷说到这个容器,从名字就可以看出,不得不说另外一个容器,也就是ArrayList。ArrayList是非线程安全的,也就是说在多个线程下进行读写,会出现异常。先举一个简单的例子,看看会出现什么问题,再来理解:我们运行一下就会出现错误:这里我们可以看到会抛出ConcurrentModificationException,这个异常是基于 fast-fail 机制的。不知道的可以私下了解一下。上面这个案例说明了ArrayList使..转载 2021-07-07 21:29:48 · 155 阅读 · 0 评论 -
HashTable、SynchronizedMap 和 ConcurrentHashMap 有什么区别
SynchronizedMap 一次性锁住整张表来保证线程安全,所以每次只能有一个线程来访问map。synchronizedMap实现了Map接口。 构造synchronizedMap时将this指针传递给监视器对象mutex,即同步方法块锁住的是synchronizedMap对象自身,并将方法代理在Map集合m的方法上。 synchronizedMap是Collections的私有静态内部类,可以通过Collecitons.synchronizedMap(Map...转载 2021-07-07 21:39:00 · 241 阅读 · 0 评论 -
java并发编程--- stop() 和 interrupt() 方法的主要区别
stop() 方法会真的杀死线程,不给线程喘息的机会,如果线程持有 ReentrantLock 锁,被 stop() 的线程并不会自动调用 ReentrantLock 的 unlock() 去释放锁,那其他线程就再也没机会获得 ReentrantLock 锁,这实在是太危险了。所以该方法就不建议使用了,类似的方法还有 suspend() 和 resume() 方法,这两个方法同样也都不建议使用了,所以这里也就不多介绍了。而 interrupt() 方法就温柔多了,interrupt() 方法仅仅是通知线转载 2021-07-07 21:40:25 · 652 阅读 · 0 评论 -
Java 中用到的线程调度算法是什么?
计算机通常只有一个CPU,在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才能执行指令.所谓多线程的并发运行,其实是指从宏观上看,各个线程轮流获得CPU的使用权,分别执行各自的任务.在运行池中,会有多个处于就绪状态的线程在等待CPU,JAVA虚拟机的一项任务就是负责线程的调度,线程调度是指按照特定机制为多个线程分配CPU的使用权.有两种调度模型:分时调度模型和抢占式调度模型。分时调度模型是指让所有的线程轮流获得cpu的使用权,并且平均分配每个...转载 2021-07-05 18:45:51 · 317 阅读 · 0 评论 -
Java CyclicBarrier原理
1、CyclicBarrier的简单概述现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。下图演示了这一过程。CyclicBarrier字面意思是“可重复使用的栅转载 2021-07-05 18:40:01 · 141 阅读 · 0 评论 -
Java 关于多线程的一些思考
1.什么是原子操作,Java中的原子操作是什么?所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch。深入了解原子操作2. Java中的volatile关键是什么作用?volatile是Java提供的一种轻量级的同步机制。在并发编程的三个基本概念(原子性、可见性、有序性)中,volatile就保证了线程的可见性。当一个变量被volatile修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会立即被更新到主内存中,其转载 2021-07-05 18:35:24 · 85 阅读 · 0 评论 -
Java runnable 和 callable 有什么区别?Future是什么?
在java中,实现线程的方式不仅仅有runnable接口,Thread类,还有callable接口,但是runnable接口和thread类中,都是没有返回值的。但是在callable接口的实现中,是可以有值返回的;经过代码的编写,有两种方法可以取出返回值具体方法请看如下代码分别使用 FutureTask 和 线程池完成回调。源码分析首先简历线程池可以发现,底层实现是有同步队列的,也就是说线程等待是在队列中完成的ThreadFactory,线程转载 2021-07-05 18:30:42 · 511 阅读 · 0 评论 -
什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?
什么是阻塞队列阻塞队列是一个支持阻塞的插入和移除的队列。 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:意思是队列为空时,获取元素(同时移除元素)的线程会被阻塞,等到队列变为非空。 阻塞队列用法阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里获取元素的线程。当阻塞队列不可用时,会有四种相应的处理方式:处理方式 抛出异常 返回特殊值 一直阻塞 超时退出转载 2021-07-05 18:27:16 · 373 阅读 · 0 评论 -
mysql的事务四个特性以及事务的四个隔离级别
一、事务四大属性分别是原子性、一致性、隔离性、持久性。1、原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。2、一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结转载 2021-07-05 18:18:57 · 114 阅读 · 0 评论