
基础知识
谈胖胖
码农
展开
-
Redis系列--持久化方式(二)
Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。另外Redis的数据持久化机制是可以关闭的。如果你只把Redis作为缓存服务使用,Redis中存储的所有数据都不是该数据的主体而仅仅是同步过来的备份,那么可以关闭Redis的数据持久化机制。但通常来说,仍然建议至少开启RDB方式的数据持久化,因为:...原创 2019-01-23 08:50:00 · 3632 阅读 · 5 评论 -
多线程系列---多线程实现的方式(四)
Executor框架是一种将线程的创建和执行分离的机制。它基于Executor和ExecutorService接口,及这两个接口的实现类ThreadPoolExecutor展开,Executor有一个内部线程池,并提供了将任务传递到池中线程以获得执行的方法,可传递的任务有如下两种:通过Runnable接口实现的任务和通过Callable接口实现的任务。在这两种情况下,只需要传递任务...原创 2019-05-07 09:11:27 · 5023 阅读 · 0 评论 -
多线程系列---总结篇之常见问题(十三)
1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点。2) 线程和进程有什么区别?线程是进程的子集,一个进程可以有...原创 2019-05-10 06:52:02 · 3626 阅读 · 2 评论 -
多线程系列---总结篇之常见问题(高级篇)(十四)
关于 synchronized 关键字的 5 连击1.1 说一说自己对于 synchronized 关键字的了解synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖...原创 2019-05-10 07:19:46 · 3565 阅读 · 2 评论 -
多线程系列---线程范围内的共享变量(五)
模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程。package com.ljq.test.thread;import java.util.HashMap;import java.util.Map;import java.util.Random;/** * 线程范围内的共享变量 * * 三个模块共享数据,主线程模块和AB模...原创 2019-05-07 21:04:18 · 8690 阅读 · 0 评论 -
多线程系列---多线程共享变量(六)
Java中可以通过synchronized、volatile、java concurrent类来实现共享变量的可见性。synchronized实现可见性synchronized 实际上是对访问修改共享变量的代码块进行加互斥锁,多个线程对synchronized代码块的访问时,某一时刻仅仅有一个线程在访问和修改代码块中的内 容(加锁),其他所有的线程等待该线程离开代码块时(释放锁)才有机会进...原创 2019-05-07 21:39:20 · 6002 阅读 · 0 评论 -
多线程系列---Atomic包原子类介绍(八)
一、何谓Atomic?Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。计算机中的Atomic是指不能分割成若干部分的意思。如果一段代码被认为是Atomic,则表示这段代码在执行过程中,是不能被中断的。通常来说,原子指令由硬件提供,供软件来实现原子方法(某个线程进入该方法后,就不会被中断,直到其执行完成)在x86平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上...原创 2019-05-08 08:14:10 · 4897 阅读 · 0 评论 -
多线程系列---深入剖析volatile关键字(七)
1.volatile关键字的两层语义保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 禁止进行指令重排序。先看一段代码,假如线程1先执行,线程2后执行://线程1boolean stop = false;while(!stop){ doSomething();} //线程2stop = true;这段...原创 2019-05-08 08:35:24 · 5538 阅读 · 2 评论 -
集合类系列--树型结构
基本概念由上图看得出树是一些节点的集合,总结一下树的一些基本概念:1、结点:树中的数据元素都称之为结点 2、根:最上面的结点称之为根,一颗树只有一个根且由根发展而来,从另外一个角度来说,每个结点都可以认为是其子树的根 3、父亲:结点的上层结点,如图中,结点K的父亲是E、结点L的父亲是G 4、兄弟:具有相同父亲的结点称为兄弟,图中F、G、H互为兄弟 5、结点的度:结点所拥有的子树...原创 2019-05-12 09:09:59 · 5390 阅读 · 1 评论 -
集合类系列---基本数据汇总
主要分为两个分支:Collection,MapCollectionlist (ArrayList ,LinkedList(频繁插入删除的时候用),Vector(线程安全),Stack(先进后出)); set (HashSet(无序,根据哈希值查找Entry),TreeSet(需要排序的时候用),LinkedHashSet(有序&&有序迭代的时候用) )MapTree...原创 2019-05-12 21:42:57 · 3166 阅读 · 1 评论 -
关于JAVA的常见内存溢出问题
set CATALINA_OPTS=-Xms128M -Xmx256Mset JAVA_OPTS=-Xms128M -Xmx256M或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M -Xmx256M原创 2019-07-07 21:44:53 · 2448 阅读 · 2 评论 -
数据结构---HashMap原理解析
hashing(散列法或哈希法)的概念散列法(Hashing)是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。HashMap概念和底层结构HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映...原创 2019-07-22 08:25:27 · 1588 阅读 · 0 评论 -
算法---分支限界法
一、基本描述 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。 (1)分支搜索算法 所谓“分支”就是采用广度优先的策略,依...原创 2019-05-14 09:02:31 · 1515 阅读 · 0 评论 -
算法---贪心算法
一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。...原创 2019-05-14 09:00:30 · 1326 阅读 · 0 评论 -
算法---动态规划算法
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通...原创 2019-05-14 08:57:42 · 2219 阅读 · 1 评论 -
Redis系列--常见应用场景(四)
Redis的7个应用场景一:缓存——热数据热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了丰富的数据类型可以使用,另外,内存中的数据也提供了AOF和RDB等持久化机制可以选择,要冷、热的还是忽冷忽热的都可选。结合具体应用需要注意一下:很多人用spring的...原创 2019-01-29 08:27:25 · 3823 阅读 · 3 评论 -
JAVA基础-反射
Java让我们在运行时识别对象和类的信息,主要有2种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息;另一种是反射机制,它允许我们在运行时发现和使用类的信息。Class对象 理解RTTI在Java中的工作原理,首先需要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息。Class对象就是用来创建所有“常规”对象的,Java使用Cl...原创 2019-03-04 22:05:51 · 2301 阅读 · 1 评论 -
JVM运行时内存结构
主要结构:堆内存、方法区、栈(说明:基于JDK1.7)堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配; 方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆); 栈又分为java虚...原创 2019-02-26 08:20:52 · 6380 阅读 · 5 评论 -
类的加载过程
1.类加载过程类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示:其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持 Java 语言的运行...原创 2019-03-03 19:45:49 · 3118 阅读 · 1 评论 -
JAVA基础-代理(三种方式)
简介:代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。1.静态代理:静态代理在使用时,需要定义接口或者父类,被代理对象(目标对象)与代理对象...原创 2019-03-10 21:11:34 · 2474 阅读 · 1 评论 -
Java常见性能优化
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。1. 尽量在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:控制资源的使用,通过线程同步来控制资源的并发访问; 控制实例的产生,以达到节约资源的目的; 控制数据...原创 2019-05-04 08:28:52 · 5614 阅读 · 1 评论 -
多线程系列---同步工具类(九)
CountDownLatch 同步倒数计数器CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch对象内部存有一个整数作为计数器。调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者会停止等待。计数器的操作是原子性的。常用API构造方法CountDownLatch(int count)构造方法参数指定了计数的次数...原创 2019-05-08 21:41:01 · 4441 阅读 · 1 评论 -
集合类系列---HashMap原理
一、基本属性static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //默认初始化大小 16 static final float DEFAULT_LOAD_FACTOR = 0.75f; //负载因子0.75static final Entry<?,?>[] EMPTY_TABLE = {}; ...原创 2019-05-13 21:47:43 · 3282 阅读 · 1 评论 -
多线程系列---阻塞队列(十)
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:方法\处理方式 抛出...原创 2019-05-09 08:24:23 · 2792 阅读 · 1 评论 -
多线程系统---并发包下的集合类(十一)
先看一张描述java.util.concurrent包下集合组成结构的类图:下列介绍的集合统一特性:线程安全,支持并发操作非阻塞队列(队列无数据,操作队列产生异常或返回null,不具备等待/阻塞的特色)ConcurrentHashMap:相对于线程安全的HashTable,优势在于HashTable不支持在循环(iterator)中对结构调整(增、删),否则会有ConcurrentM...原创 2019-05-09 08:50:46 · 3770 阅读 · 2 评论 -
算法---分治算法
一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其...原创 2019-05-14 08:52:59 · 3684 阅读 · 1 评论 -
JVM系列---对象的创建,定位及访问
Java对象创建底层原理1.虚拟机遇到一条new指令时,首先检查这个对应的类能否在常量池中定位到一个类的符号引用;2.判断这个类是否已经被加载,解析,初始化3.为这个新生对象在java堆中分配内存空间,其中分配内存空间的方式有两种 指针碰撞:分配内存空间包括开辟一块内存和移动指针两个步骤;非原子步骤可能出现并发问题,Java虚拟机采用CAS配上失败重试的方式保证更新操...原创 2019-10-07 15:05:06 · 3892 阅读 · 1 评论