java
刘二郎
很懒
展开
-
java-静态变量的加载
同一级的按照加载顺序,也就是类中写的顺序执行1.静态变量,静态块2.实例变量,实例块3.构造函数一.public class Test {private static Test tsc = new Test(); //静态变量 (这边初始化为什么会被执行,因为有这个类的对象产生了)private Test(){原创 2017-03-27 21:06:48 · 1022 阅读 · 0 评论 -
Java-线程知识总结
1. 基本解释:进程:进程是系统进行资源分配和调度的一个基本单位。线程:是CPU调度和分派的基本单位。联系:线程之间会互相影响,同一个进程中的多个线程之间可以并发执行。进程的概念更大,线程的概念更接近执行体的概念,它可以与同进程中的的其他线程共享数据,但拥有自己的独立的空间。区别:1.1一个程序至少一个进程,一个进程至少一个线程。1.2进程在执行过程中拥有独立的内存单元,而多个线程共享内存。1.3...原创 2018-04-11 17:16:57 · 250 阅读 · 0 评论 -
线程wait和notify深入学习和分析
我们都知道简单的生产者和消费者的实现就是通过Object内的wait和notify实现的。至于例子暂时不写了。一、前言常见面试题:为什么wait和notify方法是Object类中的方法,而不是在Thread里,毕竟通常我们都是在多线程的时候在使用wait和notify方法。解释:1.首先我们知道生产者和消费者模型里,我们使用的是一个Object lock = new Object()。然后在新起...原创 2018-04-13 10:12:22 · 2169 阅读 · 0 评论 -
LockSupport分析
前几篇分析过wait和notify方法,这两个方法是用来在两个线程之间进行通信的(生产者消费者模型的基本实现)。a.wait()-> b.execute()->b.notify()->a.execute()。我们要知道,在实现两个线程之间能够切换运行时,wait和notify方法其实是运用了一个中间变量,就是Object对象来实现的。今天我们要学习的LockSupport则不是这...原创 2018-04-26 15:45:09 · 422 阅读 · 0 评论 -
sleep()和yield()以及join()
yield()方法意味着“让步”。1.让步的意思线程告诉cpu,你可以去执行其他的线程,我可以让出当前cpu的执行权利。2.它的作用就是将当前线程从执行状态转变到可执行状态。3.但是它不能保证其他线程一定能够执行,因为执行过yield的线程当前依然是可执行的状态,有可能被cpu再次执行。4.但是执行yield的线程不会释放锁,这是要注意的。例子1public class Test { p...原创 2018-04-13 21:46:01 · 1060 阅读 · 0 评论 -
JDK动态代理
JDK动态代理的理解可以帮助我们很好的去理解Spring的AOP思想以及实现。废话不多说,先来个小例子。1. 定义一个接口,因为JDK动态代理代理的是实现了接口的类public interface PersonalTest { void printString(String str); void printString1(String str);}2.其实现类pub...原创 2018-05-09 17:42:04 · 136 阅读 · 0 评论 -
Cglib 动态代理
JDK的动态代理需要被代理类要实现接口,但是Cglib不需要,Cglib会生成代理类的子类,并在代理类中对代理方法进行增强,CGlib的底层是采用的ASM字节码技术。一切的学习从例子开始:一、测试用例1. 需要被代理的目标类public class PersonC { public void doSomething(){ System.out.println("doin...原创 2018-05-11 15:08:03 · 136 阅读 · 0 评论 -
Java中的SPI理念
SPI:Service provider Interface。这个理念对于一般的Java开发者来说有点陌生的,它主要针对的还是中间服务商或者针对插件开发。最熟悉的莫过于数据库中的jar包问题,一般如果我们想使用mysql数据库,那么我们导入mysql的jar,Orcle数据库的话,我们导入Orcle的jar。这里运用的其实就是SPI的思想。1.作用为接口寻找实现类。2.实现方式2.1指定接口的标准...原创 2018-05-15 20:45:21 · 252 阅读 · 0 评论 -
红黑树的插入全过程图化
本篇是在之前的学习插入时的补充篇幅。目标时从头图化出一个完整的红黑树的构造过程。理论参考构建过程中随机生成一个数字作为红黑树的域。Case场景分为两种,一种是CaseA1,2,3系列,一种是CaseB1,2,3系列,具体参见理论参考中的修正操作伪代码。插入节点275。没啥好说的,根节点了,黑色。插入节点711。插入节点260。插入节点515(满足Case...原创 2018-07-03 16:20:58 · 4885 阅读 · 6 评论 -
红黑树原理,算法,和构建过程的分析和学习
参考文章:红黑树原理:此篇逻辑清晰,但是红黑树的配图不行,没法根据图来进行实际的操作理解,本文的意图就是根据作者的思路进行图片的重新分析。《算法导论》中文版,中文版翻译的马马虎虎,但是有些概念翻译的有点烂,在学习过程中会产生一些疑惑,需要及时更新自己的认知。红黑树特性:(1)每个节点要么红要么黑。(2)根节点黑色。(3)每个叶子节点是黑色。【叶子节点指的是NIL或者NULL的叶子节点】。(4)如果...原创 2018-07-05 15:13:25 · 2177 阅读 · 2 评论 -
红黑树的删除全过程图化
本篇是在之前的学习删除时的补充篇幅。目标时从头图化出一个完整的红黑树的删除过程。理论参考随意构造了一个红黑树如下:图1-1:删除514:这种场景最简单,因为被删除节点没有子节点。删除11(满足Case1和Case4):比较复杂,因为它是黑节点。删除383:更加复杂,因为它有孩子节点。而且删除383的时候的逻辑是走的完全相反的,和插入一样,分成A,B两个场景,但是A,B场景下的操作都是完全相反的,要...原创 2018-07-05 17:19:38 · 7893 阅读 · 0 评论 -
Java枚举
之前一直忽视的一个知识点,最近由于时间比较多,就干脆整理整理这些知识点,毕竟枚举也是平时使用的比较多的东西。1. 本人参与的项目中的枚举使用例子如下:public interface TestEnum { enum Status { Success(0, "成功"), Failed(1, "失败"); private Integ...原创 2018-07-18 15:25:38 · 155 阅读 · 0 评论 -
位操作
位操作应该说从学C的时候就接触过,一开始以为没什么大用,但是现在在不断的学习和有了工作经验之后,发现这个东西真是个好东西,很多便捷操作都可以借助它来实现,并且很有效率。参考文章:位操作基础篇《算法心得》参考的不多,里面很底层。位操作基础符号描述规则&按位与两个位都是1,结果才是1(1&1=1;1&0=0)| 按位或两个位都是0,结果才是0(1&0=1;...转载 2018-07-13 14:18:08 · 692 阅读 · 0 评论 -
Java-Serializable
Serializable关键字平时我们应该很少有机会去使用到,平时的业务中不需要我们去做对象状态的保存,而且一般都是中间件或者框架内才使用到。但是关于Serializable应该要去理解和学习。1. 怎么理解序列化1.首先,在我们平时运行项目时,JVM处于运行中,此时工程内的对象是存活状态,因此这些对象的生命周期是会比JVM的生命周期短的。然后有的情况下,我们需要持久化一些特殊对象,以便将...原创 2018-08-30 16:30:39 · 1182 阅读 · 0 评论 -
记2018/9月3年Java的面试感悟
我是从2015年12月开始从事Java的开发工作的,坐标南京,期初是在一个创业公司里,做一些交付项目。然而好景不长,倒闭了。哎,只能重新找工作。稳定下来是在2016年5月。其实算时间的话,还没满3年。。期间也没做过一些像样的互联网项目。只不过当前公司里使用了当下比较火的互联网技术,但是并没有相应的场景或者数据量来支撑,因此比较困惑,所以想跳槽了。面试经过:1家上市公司+3家独角兽。第一...原创 2018-09-25 13:45:28 · 296 阅读 · 0 评论 -
关于APP端接口设计的几点思考
对于做服务端开发的人来说,一般只关注接口的入参擦传入和数据的组装返回,以前在做web系统时,一般会根据页面展示数据的不同去实现不同的接口,有新的业务就做新的接口设计,有需要修改的旧业务,就在以前的接口里去更新业务逻辑。但是这套做法不适用于针对APP端的接口,原因就在于APP的业务需要靠升级去呈现出不同的功能以及不同的数据,举个例子:获取用户信息接口getUserInfo在V1.0.0里和在...原创 2019-04-21 09:21:11 · 818 阅读 · 0 评论 -
interrupt()和interrupted()以及isInterrupted()
这一篇着重分析下线程中断,在C.U.T中,中断是用的比较多的一种技术手段,运用的好能带来很多的便利。1.interrupt() public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) ...原创 2018-04-17 15:00:28 · 1023 阅读 · 0 评论 -
分布式锁的3种实现方式
说起分布式的概念,首当其冲就是CAP理论,即满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)。但是CAP理论告诉我们,任何系统只能满足其中两个,所以都要求去做取舍。那么人们常说的一般都是,需要牺牲一致性来保证系统的高可用性,只要保证系统的最终一致性,并且允许的时间差值能够被接受就行。对于这个,本人的体会就是订单系统,对于...原创 2018-04-04 15:20:58 · 8903 阅读 · 1 评论 -
Java--偏向锁/轻量级锁/重量级锁
首先要解释清楚这几种锁的特征和区别,以及运行时候的变化,需要了解Java对象头的一些知识,在Java对象头的Mark Word内就记录着这些不同锁的状态位。另外偏向锁---轻量级锁---重量级锁本文都需要依托synchronize进行理解和分析。另外也要参照网络上很多的资料。1.对象头:关于对象头的具体记录,可以参考这边:对象头2.同步的原理:关于JVM规范对于同步的解释,可以参考这边:monit...原创 2018-04-10 14:34:01 · 1427 阅读 · 0 评论 -
java-CAS 原理
最近感兴趣的内容到J.U.C包中了,当然了,对于这个包我的理解还是只看见大门,首先,自己没机会在项目中实战,其次,平时很少练手,再其次,最近才看,所以很多文章都是网上大牛写的,自己翻译过来,就当做逼自己重新看一遍了。首先谈谈自己对于锁的恐惧吧,其实对于每个初级人员来说,锁是一个高深的问题,一般情况下我估计所有的初级人员来说的话,都很少使用,即使使用了,也是简单的synchronized吧,对于翻译 2017-05-10 14:36:12 · 302 阅读 · 0 评论 -
java-多态性
所谓多态 就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改原创 2017-05-02 15:57:17 · 341 阅读 · 0 评论 -
转载别人整理的面试题,留着自己学习
最新整理简述synchronized?Object;Monitor机制;简述happen-before规则;JUC和Object;Monitor机制区别是什么;简述AQS原理;简述DCL失效原因,解决方法;简述nio原理;jvm运行时数据区域有哪几部分组成,各自作用;gc算法有哪些;gc收集器有哪些;简转载 2017-06-07 09:14:11 · 1446 阅读 · 0 评论 -
java-反射(一)-反射的概念性学习
反射是java里面一个很特殊的环节,我们一直都说java是一次编译,到处运行,有没有发现,我们都是说编译,然后是运行。但是对于反射来说,它不是出于编译期时,而是出于运行期。也就是反射是在运行期期间获取类中的属性和方法,调用其中方法的一种机制。反射里面最重要的一个环节就是获取Class对象,然后才能获取其中的属性和方法。至于什么是Class对象,Class对象什么时候生成?怎么生成?可以参考原创 2017-11-27 14:17:17 · 170 阅读 · 0 评论 -
long和double的线程安全问题
java规范规定了对基本数据类型的操作必须是原子性的,但是long和double除外。但是对于volatile 修饰的long和double,读写必须为原子的。但是规范没有规定怎么去实现,现今的虚拟机都是把32位作为原子性操作。但是对于64位确没有,因此64位虚拟机操作long和double时,会出现两次写操作,这就造成了错位可能,因此在64位上操作共享的long和原创 2018-01-17 11:21:38 · 3190 阅读 · 0 评论 -
ThreadLocal分析--部分源码
今年的个人文章到今天还没有更新,主要前一段时间一直在感冒中,精神状态太差,对着屏幕都提不起精神,浑浑噩噩的。到今天才有所好转对于ThreadLocal来说,个人感觉,在平时的业务代码中,ThreadLocal使用的真是太少了。但是去读过Spring的事务那一块源码的朋友一定记得很深,它的holder就是使用了ThreadLocal来绑定当前线程使用的事务信息。参考博客ThreadLocal源码解读...原创 2018-03-09 14:48:39 · 231 阅读 · 0 评论 -
Java异常体系结构解析
Java内的异常体系结构如下:草图1.Throwable是所有错误和异常的超类,异常又分为运行时异常和非运行时异常,又可以分为不检查型日常和检查型异常。2.Error和ExceptionError是错误,是程序无法处理的问题,一般由JVM抛出,像OOM等。Exception是异常,程序要尽可能去处理这些异常。3.运行时异常和非运行时异常运行时异常一般称作 不检查异常,一般是由于逻辑错误导致的,可以...原创 2018-03-19 16:47:02 · 423 阅读 · 0 评论 -
Java--CAS问题汇总
关于Java内的CAS,应该说它是整个c.u.t包的基石。全称(compare and swqp),比较和交换,应该说看过源码的,尤其是最简单atomicInteger的,会发现它其实就是在自旋的基础上去更新某一个值,是一种乐观锁,它认为这个变量读大于写。至于例子,我就引用原有的一篇博客,里面有测试例子。CAS实践今天要补充的是关于CAS底层的一些分析。网上截取了一段关于CAS底层方法。需要注意的...原创 2018-03-23 15:43:43 · 347 阅读 · 0 评论 -
Java--自旋锁
自旋锁顾名思义就是自己在那边打转,就是在不断循环,等待合适的条件然后进入临界区进行操作。举个例子好解释:当前存在线程A和线程B,线程A获取到锁之后,那么此时线程B再想获取时,需要等待。假设此时线程之间的竞争不是很激烈,而处理器阻塞一个线程引起的线程上下文之间的切换的代价高于等待资源的情况下,那么线程B可以不放弃CPU的时间片,而是在原地等待,直到获取到锁,进入临界区。带来的问题:1.首先就是线程B...原创 2018-03-23 17:34:05 · 174 阅读 · 0 评论 -
Java--乐观锁/悲观锁
乐观锁和悲观锁并不是指具体的锁,而是说的是一种理念型的锁,说的实际一点就是角度问题。乐观锁:它认为对一个数据的并发操作,是不会发生修改的,简单来说,就是只读不写,当然这是一种理想情况,更多的时候是读大于写。在Java中比较重要的就是无锁编程的理念,特别是CAS算法,也就是C.U.T的核心理念。无锁的情况下,性能会得到很多提升。悲观锁:它认为对一个数据的并发修改是一定会发生修改的。也就是写大于读的场...原创 2018-03-23 21:17:35 · 200 阅读 · 0 评论 -
Java--独占锁/共享锁
独享锁和共享锁在你去读C.U.T包下的ReeReentrantLock和ReentrantReadWriteLock你就会发现,它俩一个是独享一个是共享锁。独享锁:该锁每一次只能被一个线程所持有。共享锁:该锁可被多个线程共有,典型的就是ReentrantReadWriteLock里的读锁,它的读锁是可以被共享的,但是它的写锁确每次只能被独占。对于独享和共享,基于的点在于AQS,AQS的学习在以前就...原创 2018-03-23 21:29:57 · 4420 阅读 · 5 评论 -
Java---可重入锁
可重入锁,顾明意思,就是一个线程在获取了当前锁之后,当它再来时不需要获取,直接就能进入。当然对于ReentrantLOck来说,它的可重入就是根据一个计数器来统计进入几次,而对于Synchronize来说,就是和它对象所关联的monitor对象内的一个计数器来计数。具体参见:synchronizeReentrantLock...原创 2018-03-23 21:41:34 · 160 阅读 · 0 评论 -
synchronize的原理分析
synchronize是平时用的比较多的多线程问题的解决方案,一般说存在多线程问题,加个锁,就用synchronize吧,简单,方便。用lock你还要自己去lock,unlock,没经验的人使用起来没那么溜。今天,就来看看synchronize背后的一些详细知识点,尽量做到广而深。这样的学习才有意思。对于synchronize的学习,我是准备先实践,再分析,再总结。情况1:同一个对象在两个线程中分...原创 2018-03-20 21:05:29 · 12293 阅读 · 8 评论 -
锁的消除和粗化
锁的消除出现的时机:虚拟机即时编译期运行时。出现的原因:主要判断依据就是来源于逃逸分析的数据支持,如果判断在一段代码中,堆上的所有数据都不会逃逸出去从而被其他线程访问到,那就可以把它们当做栈上的数据对待,认为它们是线程私有,同步锁无须进行。出现的典型例子:本身对于String的连接操作JVM会转化成StringBudiler进行连接,既然转化成了sb,那么其实sb是一个局部变量,对于append操...原创 2018-04-10 16:56:28 · 1940 阅读 · 0 评论 -
Java---并发知识合集大纲
这一篇作为一篇标签,记录下线程中一些常见的知识点,以及互相之间的分析和总结,希望通过这些知识来提高一下自己。一、线程基础1.同步原语synchronizevolatilevolatile2CAS操作2.Java内存模型JVM解释(繁琐)JVM解释2(简单)final域3.Thread线程间的状态切换wait和notify方法分析sleep/yield/join()分析interruptThread...原创 2018-04-10 17:03:58 · 302 阅读 · 0 评论 -
lambda表达式
业务开发中有个很常见的场景:比如我现在有个List<Student> list 集合,我现在只想获取id集合或者我想做成Map<sId,sName>的格式,以便我在下面的逻辑里能够直接通过Map.get(sId)获取业务数据。1. 代码里循环list转成map。2.做成工具类,传入list,返回想要的key,value,方便。但是好痛苦,,工具类要不断复制,...原创 2019-05-05 17:26:28 · 157 阅读 · 0 评论