java基础进阶
文章平均质量分 84
周星猩
未知
展开
-
synchronized 优化手段之锁膨胀机制!
synchronized 在 JDK 1.5 之前性能是比较低的,在那时我们通常会选择使用 Lock 来替代 synchronized。然而这个情况在 JDK 1.6 时就发生了改变,JDK 1.6 中对 synchronized 进行了各种优化,性能也得到了大幅的提升,这也是目前版本中还能经常见到 synchronized 身影的重要原因之一。当然除了性能之外,synchronized 的使用也非常便利,这也是它流行的重要原因。在众多优化方案中,锁膨胀机制是提升 synchronized 性能最有利的转载 2021-08-18 23:51:47 · 216 阅读 · 0 评论 -
秒懂log4j1与log4j2的区别
相信很多程序猿朋友对log4j都很熟悉,随着技术的发展,log4j的结构、性能被很多新的日志框架所替代。在设计结构上比不上slf4j,在性能上比不上logback。于是apache对垂垂老矣的log4j进行一次重生,不是优化。虽然都叫log4j但是,他们是两个完全不同的东西,为了方便区分他们,给了两个别名:log4j1、log4j2。slf4j的成功在于他的高屋建瓴,俯视一切。slf4j是日志门面(像:java的接口,没有提供任何实现),通过提供各种桥接器,适配各种日志框架(log4j1,jul等)。l原创 2021-03-27 20:50:15 · 7344 阅读 · 0 评论 -
javac编译debug调试
javac编译器的入口在com.sun.tools.javac.Main类中,该类在tools.jar包中。如果没有tools.jar包,自己添加一下:写一个无法编译通过的类:package com.company;public class Test { public static void main(String[] args) { Integer a = "1"; }}idea会自动检查语法,这么写是idea会报错。所有我...原创 2020-11-29 20:59:22 · 892 阅读 · 0 评论 -
Java 程序读取Mysql数据库时间信息与真实时间相差 13、14 小时、SQLException: HOUR_OF_DAY: 2 -> 3
CST时区引起的异常:Java 程序读取Mysql数据库时间信息,与真实时间相差 13、14 小时java.sql.SQLException: HOUR_OF_DAY: 2 -> 3原因:Mysql 驱动:mysql-connector-java 升级到8版本后。将数据库时间解析到java时间,需要获取数据库的时区。java如何数据库时区:1、数据库连接中指明的时区,就用该时区,优先级最高。datasource.urljdbc:mysql://127.0.0.1:3306/your原创 2020-10-12 23:58:00 · 4551 阅读 · 5 评论 -
静态代理之AspectJ编译织入
前面两篇文章都是说的在代码运行时动态的生成class文件达到动态代理的目的,那我们现在回到静态代理,静态代理唯一的缺点就是我们需要对每一个方法编写我们的代理逻辑,造成了工作的繁琐和复杂。AspectJ就是为了解决这个问题,在编译成class字节码的时候在方法周围加上业务逻辑。复杂的工作由特定的编译器帮我们做。AOP有切面(Aspect)、连接点(joinpoint)、通知(advice)、切入点(Pointcut)、目标对象(target)等概念,这里不详细介绍这些概念.AspectJ的使用如何转载 2020-09-05 15:41:03 · 2112 阅读 · 0 评论 -
CompletableFuture 使用详解
CompletableFuture 使用详解1、 runAsync 和 supplyAsync方法CompletableFuture 提供了四个静态方法来创建一个异步操作。public static CompletableFuture<Void> runAsync(Runnable runnable)public static CompletableFuture&...原创 2019-12-22 15:39:54 · 7167 阅读 · 4 评论 -
cglib
什么是CGLIBCGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。为什么使用CGLIBCGLIB代理主要通过对字节码的操作,为对象引入间接...转载 2019-11-24 21:01:38 · 257 阅读 · 0 评论 -
Java Bridge Method
bridge method如果一个类继承了一个范型类或者实现了一个范型接口, 那么编译器在编译这个类的时候就会生成一个叫做桥接方法的混合方法(混合方法简单的说就是由编译器生成的方法, 方法上有synthetic修饰符), 这个方法用于范型的类型安全处理, 用户一般不需要关心桥接方法。实例://范型接口public interface Parent<T> { v...原创 2019-11-18 23:08:40 · 264 阅读 · 0 评论 -
&&、||、&、| 的区别
&&和||是逻辑运算符,&和|是位运算符。&&逻辑与也叫做短路与,因为只要当前项为假,它就不往后判断了,直接认为表达式为假。||逻辑或也叫做短路或,因为只要当前项为真,它也不往后判断了,直接认为表达式为真。实例: public static void main(String[] args) { if (isTrue(fals...原创 2019-02-21 12:47:50 · 258 阅读 · 0 评论 -
byte、short、int、long、float、double赋值
byte b1 = 1; short s1 = 1; int i1 = 1; long l1 = 1l;// long l1 = 1;//正确,可以加L。 Byte b2 = 1; Short s2 = 1; Integer i2=1; Long l2 =...原创 2019-02-21 10:37:37 · 2688 阅读 · 0 评论 -
悲观锁、乐观锁
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改...转载 2019-03-05 18:01:16 · 97 阅读 · 0 评论 -
synchronized 详解
java中的synchronized用来给对象上锁,如果一个线程给a对象上了锁,另一个线程再想给a对象上锁时,会进入等待队列,直到可以获取锁。一个对象同时只能被一个线程上锁,学习synchronized关键看锁定的是那个对象。在开发中synchronized的使用有这几种方式:synchronized(.class)、synchronized(Object )、synchronized(this...原创 2019-02-20 14:36:17 · 855 阅读 · 0 评论 -
JVM
JVM架构JVM被分为三个主要的子系统:类加载器子系统、运行时数据区和执行引擎。JVM架构图一. 类加载器子系统Java的动态类加载功能是由类加载器子系统处理。当它在运行时(不是编译时)首次引用一个类时,它加载、链接并初始化该类文件。1.1 加载类由此组件加载。启动类加载器 (BootStrap class Loader)、扩展类加载器(Extension cla...转载 2019-03-01 15:58:08 · 135 阅读 · 0 评论 -
多线程
一、suspend、resume和stop方法suspend()、resume()和stop()方法完成了线程的暂停、恢复和终止工作但是这些API是过期的,也就是不建议使用的不建议使用的原因主要有:以suspend()方法为例,在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。同样,stop()方法在终结一个线程时不会保证线程的资源正常释放,通...原创 2019-02-24 16:15:25 · 92 阅读 · 0 评论 -
java线程池
构建一个新的线程是有一定代价的,因为涉及与操作系统的交互。如果程序中创建了大量的生命期很短的线程,应该使用线程池( thread pool)。一个线程池中包含许多准备运行的空闲线程。将 Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。另一个使用线程池的理由是减少并发线程的数目。创建大量线程会大大降低性能甚至使虚...转载 2019-02-24 16:03:28 · 128 阅读 · 0 评论 -
java强引用、软引用、弱引用、虚引用
一.强引用、软引用、弱引用、虚引用的概念 在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。 从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是...原创 2019-03-23 20:51:29 · 105 阅读 · 0 评论 -
string.intern方法
java 1.6(含)以前常量池在方法区中,java 1.7(含)后常量池在java堆中。string.intern方法 (返回常量池中该字符串的引用)(1) 当常量池中不存在”abc”这个字符串的引用(通过equal方法判断),将这个对象的引用加入常量池,返回这个对象的引用。(2) 当常量池中存在”abc”这个字符串的引用,返回这个对象的引用; String a = "a";...原创 2019-02-27 16:47:44 · 115 阅读 · 0 评论 -
左移位、右移位>>、不带符号右移位>>>的区别
public static void main(String args[]) { Integer integer = -1073741826; System.out.println(integer); System.out.println(Integer.toBinaryS...转载 2019-03-03 16:01:37 · 12165 阅读 · 1 评论 -
CSRF 和 XSS 攻击
CSRF(Cross site request forgery)跨站请求伪造,是一种对网站的恶意利用。CSRF则通过伪装成受信任用户的请求来利用受信任的网站。如:CSRF 攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作。比如说,受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://www.bank.com...原创 2019-03-15 17:01:41 · 229 阅读 · 0 评论 -
Spring AOP为什么不能拦截同一个对象内方法的嵌套调用
在开发基于 Spring 的应用的过程中碰到了一个让我困惑了好久的问题,我在一个 Service 类的 doSomething1() 方法中通过this.doSomething2(); 语句调用了同一个类中的 doSomething2 方法,运行时通过调试发现 doSomething1 方法的执行前后正常地执行了自定义的 around 装备,但是在 doSomething2 方法执行前后并未如转载 2017-11-02 14:22:56 · 1338 阅读 · 0 评论 -
BigDecimal加减乘除计算
public static void main(String args[]) { Double d1 = 1d; Double d2 = 0.3d; BigDecimal v1 = new BigDecimal(d1); BigDecimal v2 = new BigDecimal(d2); BigDecimal s...原创 2019-08-14 16:02:52 · 559 阅读 · 0 评论 -
SPI机制
JAVA拾遗--关于SPI机制JDK提供的SPI(Service Provider Interface)机制,可能很多人不太熟悉,因为这个机制是针对厂商或者插件的,也可以在一些框架的扩展中看到。其核心类java.util.ServiceLoader可以在jdk1.8的文档中看到详细的介绍。虽然不太常见,但并不代表它不常用,恰恰相反,你无时无刻不在用它。玄乎了,莫急,思考一下你的项目中是否有用到...转载 2019-08-19 14:14:37 · 188 阅读 · 0 评论 -
Java注解——Repeatable
Repeatable使用场景:在需要对同一种注解多次使用时,往往需要借助@Repeatable。实例:在生活中一个人往往是具有多种身份,如果我把每种身份当成一种注解该如何使用???先声明一个Persons类用来包含所有的身份@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME)public @inter...转载 2019-07-01 09:54:02 · 366 阅读 · 0 评论 -
java 线程池参数
Executors提供四种线程池:newCachedThreadPool :缓存线程池,如果线程池长度超过处理需要,可回收空闲线程,若无可回收,则新建线程。newFixedThreadPool : 定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool : 计划线程池,支持定时及周期性任务执行。newSingleThreadExecutor...转载 2019-03-20 00:46:51 · 208 阅读 · 0 评论 -
Runnable与Callable的比较
public interface Callable<V> { V call() throws Exception;}public interface Runnable { public abstract void run();}相同点:两者都是接口; 两者都可用来编写多线程程序; 两者都需要调用Thread.start()启动线程;不同点...转载 2019-03-19 22:40:19 · 475 阅读 · 0 评论 -
log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析
注:下文中的“桥接”、“转调”、“绑定”等词基本都是同一个概念。log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常。异常信息大致如下(摘自slf4j官网文档Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the...转载 2018-12-29 13:20:51 · 140 阅读 · 0 评论 -
前后端分离之session问题
背景目前正在开发的项目是前后端分离的项目,前端是react,后端springboot开发的微服务,在调试登录的时候发现,登录成功后把所需的信息都放到session中并存到redis里,但当用户从session中取信息的时候发现始终取不到,每次跨域请求时ajax发送的都是新的sessionid,导致无法获取信息。解决思路通过度娘查询发现必须在前后端配置一些东西,后端需在登录拦截器里增加一些响...转载 2018-12-28 15:41:13 · 3051 阅读 · 0 评论 -
计算机字符编码详解二
1. ASCII码 ASCII是美国国家标准定制的一套基于拉丁字母的电脑编码系统,可表示数字、字母等字符符号。 一个ASCII码在计算机中由一个字节存储,因此它最多可表示256个符号(一个字节为8位,2的8次方等于256),实事上,标准的ASCII编码时只用到了低7位(最高位统一为0,或者为奇偶校验位),故ASCII码可表示的数据一共只有128个(2的7次方)。这1转载 2017-07-31 17:22:45 · 926 阅读 · 2 评论 -
Java分割字符串split
String[] l="".split("#"); String[] l0="#".split("#"); String[] l1="1".split("#"); String[] l2="1#".split("#"); String[] l3="1#2".split("#"); String[] l4="1#2#".原创 2016-12-29 15:12:40 · 626 阅读 · 0 评论 -
文件读取工具类
java读取文件 可以读取类路径下的文件、文件系统文件和网络文件。该工具类是根据shiro工具类进行改写的。原创 2017-05-14 00:32:29 · 434 阅读 · 0 评论 -
位运算: 与”&、“非”~、“或||”、“异或”^ ;原码 反码 补码的相互转化
位运算符主要针对二进制,它包括了:“与”&、“非”~、“或||”、“异或”^。网大家介绍的都是些皮毛,有的还是错误的。今天就详细介绍一下。一、要想了解按位运算首先要了解二进制。二进制的基本知识就不说了。说一下计算机二进制的存储。计算机中,我们常说原码、反码、补码。1、对于正数来说 原码=反码=补码 三个码都是相等的。5的 原码:101,反码:101,补码:1原创 2017-06-30 18:13:16 · 1820 阅读 · 0 评论 -
计算机字符编码详解一
在程序中很容易出现中文乱码,主要原因是有太多的编码方式。有一个很好的网站可以查看汉字的编码:点击打开链接“中国”两字在不同的编码环境下的值。首先来看一下常用的编码有哪些,截图自Notepad++。其中ANSI在中国大陆即为GBK(以前是GB2312),最常用的是 GBK 和 UTF8无BOM 编码格式。后面三个都是有BOM头的文本格式,UCS-2即为人们常说的Unicode...原创 2017-07-31 17:00:43 · 624 阅读 · 2 评论 -
java 基本8种基本类型默认值
这张表中char是十分特殊的。它的值是Unicode ‘'\u0000’ 这是什么鬼?由于我们‘\u0000’ 小于128 ,Unicode兼容ASCII码。在ASCII表中我们发现 0是空字符 ,这和我们通常使用的空格(32)有区别呀!Ascii 表程序验证:在控制台,空字符和空格显示的效果是一样的,但是他们有本质的区别。原创 2017-08-11 11:39:14 · 799 阅读 · 0 评论 -
JavaBean中set/get的命名规范
一般JavaBean属性以小写字母开头,驼峰命名格式,相应的 getter/setter 方法是 get/set 接上首字母大写的属性名。例如:属性名为userName,其对应的getter/setter 方法是 getUserName/setUserName。但是,还有一些特殊情况:如果属性名的第一个字母是小写且第二个字母大写,那么该属性名直接用作 getter/setter 方法中...原创 2017-12-20 13:22:20 · 2290 阅读 · 0 评论 -
web项目Log4j日志输出路径配置问题 问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文
web项目Log4j日志输出路径配置问题问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文件夹下进行区分查看每个实例日志,要求通过尽可能少的改动配置文件,最好修改实例名后可以不修改log4j的配置文件。实现分析:一般实现上面需求,需要在修改完war包名称之外要再做下面配置:转载 2018-01-22 00:02:08 · 1618 阅读 · 0 评论 -
Float类源码学习
要想完全了解float和double,学习其包装类Float和Double是最好的方法。简单浏览Float的源码:ublic final class Float extends Number implements Comparable<Float> { private static final long serialVersionUID = -26712573026...原创 2018-04-04 17:46:15 · 839 阅读 · 3 评论 -
java项目编码设置
javac和java 命令是我们最熟悉的,javac有个参数-encoding ?,用于.java文件以何种编码方式编译成.class文件;java 有个参数-D'file.encoding=?' ,用于.class文件以何种编码方式运行;还有我们的.java文件自身也有编码方式。默认情况下 javac和java 都是GBK。UTF8.java 文件编码方式为UTF-8:import java....原创 2018-04-20 15:00:51 · 7726 阅读 · 0 评论 -
序列化和反序列化
一、基本概念1、什么是序列化和反序列化(1)序列化:序列化是把对象转换成字节流,以便在网络上传输或者保存在本地文件中。(2)反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。(3)本质上讲:序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。2、为什么需要序列化与反序列化我们...转载 2018-04-23 16:54:51 · 447 阅读 · 0 评论 -
jvm在32位和64位环境下对象占用空间对比
在C/C++语言中,sizeof它可以获取一个对象或者类型所占的内存字节数。在C/C++中需要sizeof是因为移植,不同的数据类型在不同的机器上大小可能不同,程序员必须知道对应的数据类型大小。 为什么Java中没有sizeof()?Java是一种纯面向对象的编程语言,它将内存管理的细节都交给Java Virtual Machine(JVM)进行管理。我们都说java是跨...原创 2018-04-16 16:04:34 · 4473 阅读 · 1 评论 -
Object类源码学习
Object 源码:public class Object { private static native void registerNatives(); static { registerNatives(); } /** * 获取类的字节码对象 */ public final native Class<...原创 2018-05-03 09:38:28 · 386 阅读 · 0 评论