
备战春招
Tyella
喜欢一切新奇好玩的事物
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java并发包提供了哪些线程安全类
一、Java并发包提供的线程安全类提供了比synchronized更高级的各种同步结构。比如ReentrantLock,Semaphore,CountDownLatch,CyclicBarrier等。 各种线程安全的容器,比如ConcurrentHashMap,有序的ConcurrentSikpListMap,以及利用快照机制,实现线程安全的动态数组CopyOnWirteArrayList。...原创 2019-02-21 16:41:47 · 775 阅读 · 0 评论 -
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
一、缓存雪崩缓存雪崩我们可以简单理解为:由于原来缓存失效(比如我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),新缓存未到,原来应该访问缓存的请求都跑去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成系统宕机,从而形成一系列连锁反应,造成整个系统崩溃。缓存雪崩对系统的冲击是非常大的,可以使用队列解决此问题。避免缓存失效时大量的并发请求落到底层系统上。还有一个...原创 2019-02-25 16:28:34 · 310 阅读 · 0 评论 -
一致性Hash算法
一、Redis集群的使用对于大型系统,当数据量很大时,需要对数据库进行分库分表。当数据量很大时,Redis同样要进行此操作,就是分库分表。假设经过分库分表,现在有4台Redis服务器,当查询一条数据的时候,此时不知道具体在哪一个服务器上,可以用Hash算法。对请求键求Hash值,公式为hash(a.png)%4=2。可知我们定位到了第2号服务器。这样就不需要遍历所有服务器,提高了性能。二、...原创 2019-02-25 19:53:25 · 173 阅读 · 0 评论 -
使用快照和AOF将Redis数据持久化到硬盘中
一、前言Redis是一款内存服务器,为了避免出现突然断电造成Redis服务器中的数据失效。我们需要对数据进行备份。将Redis在内存中的数据持久化到硬盘等非易失性介质中,来保证数据的可靠性。Redis提供了两种方式,快照和只追加文件。快照(RDB):就是我们通常所说的备份,定期将内存中的数据持久化到硬盘中。只追加文件(AOF):在执行写命令的时候,将写命令复制到硬盘中,后期只需再重新执...原创 2019-02-25 20:39:29 · 308 阅读 · 0 评论 -
Java NIO浅析
一、Java有哪些IO方式传统的java.Io包,基于流模型实现,提供了我们最熟悉的一些功能,包括File抽象,输入输出流等。交互方式是同步、阻塞的方式。比如在读取输入流时,在输入流就绪之前,线程会一直阻塞在哪里。它们之间的调用是可靠的线性调用。java.Io包的优点是比较简单,缺点是IO效率和扩展性存在局限性,容易成为应用性能瓶颈。在Java1.4中引入了NIO框架(Java.nio包)...原创 2019-02-20 13:33:49 · 333 阅读 · 0 评论 -
面向对象设计基础
一、接口和抽象类的区别接口是对行为的抽象,是抽象方法的集合。利用接口可以实现API定义和实现分离的目的。接口里面不能包含任何变量,不能实例化。同时,接口没有非静态方法的实现,也就是说要么是抽象方法,要么是静态方法。Java标准库定义了非常多的接口,比如java.util.List。抽象类是不能实例化的类,用abstract关键字修饰class,其主要目的是代码重用。除了不能实例化外,其和普...原创 2019-02-20 15:57:28 · 180 阅读 · 0 评论 -
从输入URL到页面加载发生了什么
总体来说发生了以下几个过程:DNSj解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器渲染解析页面 连接结束一、DNS解析DNS解析就是确定那台计算机上有所需要的资源。互联网上每台计算机的唯一标识就是它的IP地址,我们常用的是URL,方便记忆。网址到IP地址的转换,就是DNS解析。它实际上充当了一个翻译的角色。DNS解析是一个递归调用的过程。当需要...原创 2019-03-05 17:01:21 · 230 阅读 · 0 评论 -
Synchronized底层实现
一、锁的几种形式传统的锁传统的锁(也就是下文要说的重量级锁)依赖于系统的同步函数,这些同步函数都涉及到用户态和内核态的切换、进程的上下文切换,成本较高。所以对于加了synchronized关键字但是运行时并没有多线程竞争,或两个线程接近于交替执行的情况,传统的锁机制无疑是效率比较低的。在JDK1.6之前,synchronized只有传统的锁机制,因此给开发者留下了synchronized关...转载 2019-02-20 22:15:50 · 169 阅读 · 0 评论 -
synchronized和ReentrantLock有什么区别
一、synchronized和ReentrantLock的区别synchronized是Java内置的同步机制,它提供了互斥的语义和可见性。当一个线程已经获取当前锁时,其他试图获取的线程只能等待或阻塞在哪里。在Java5之前,synchronized是唯一的同步手段。在代码中,synchronized可以修饰方法,也可以用在特定的代码块上。ReentrantLock,重入锁,是Java5提...原创 2019-02-20 22:45:50 · 2259 阅读 · 0 评论 -
线程的生命周期和状态转移
一、一个线程两次调用start()方法会出现什么情况Java的线程是不允许启动两次的,第二次调用start()方法会抛出IllegalThreadStateException,这是一种运行时异常。多次调用start()会被认为是一种编程错误。二、线程的生命周期Java的线程状态被定义在公共枚举类java.lang.Thread.state中。一种有六种状态:新建(NEW):表示线程...原创 2019-02-21 12:09:30 · 1505 阅读 · 0 评论 -
计算机网络复习
一、对称加密和非对称加密利用HTTP协议在互联网上通信时,数据是非加密传输的。数据可能被其他人截获,造成信息泄露。为了解决此问题,需要加密。加密有两种方式,一种是对称加密,一种是非对称加密。在对称加密算法中,加密和解密对应的秘钥是相同的。要保证安全的话,对称加密的秘钥不能泄露,必须保密。非对称加密算法的加密秘钥和解密秘钥是不同的,一种是公开的公钥,一种是谁都不能给的私钥。公钥加密的信息,只...原创 2019-03-06 23:51:34 · 360 阅读 · 0 评论 -
Java复习
一、COllections.sort内部原理Collection.sort()排序通过泛化实现对所有类型的排序,对于基础类型如int,string,按照字符表,数字大小排序。对于自定义类型,通过实现Comparable接口,重写comparableTo()方法自定义比较大小的方式。也可以使用Comparator外比较器,Comparable接口的方式比实现Comparator接口的耦合性要强一...原创 2019-03-04 16:44:54 · 499 阅读 · 0 评论 -
为什么说Redis是单线程的以及为什么Redis这么快
一、Redis为什么这么快Redis是一个基于内存的采用单进程单线程模型的key-value数据库,由c语言编写,官方提供的数据是可以达到100000+QPS。为什么能这么快,主要有以下几点:完全基于内存,绝大多数请求都是纯粹的内存操作,非常快速。数据存储在内存中相当于HashMap,查找和操作时间复杂度都是O(1)。 采用单线程,避免了不必要的竞争和上下文切换,也不存在多线程或多进程导...转载 2019-02-25 16:08:17 · 228 阅读 · 0 评论 -
Redis五种数据结构
一、Redis五种数据类型 Redis除了存储键之外还可以存储常见的5种数据类型,分别是:String、List、Set、Zset、Hash。结构类型 结构存储的值 结构的读写能力 String字符串 可以是字符串、整数或浮点数 对整个字符串或字符串的一部分进行操作 对整数或浮点数进行自增或自减操作 List列表 一个链...转载 2019-02-25 15:01:50 · 337 阅读 · 0 评论 -
ConcurrentLinkedQueue和LinkedBlockedQueue的区别
一、ConcurrentLinkedQueue和LinkedBlockedQueue的区别ConcurrentLinkedQueue内部基于CAS机制,在常见的多线程访问场景,一般可以提供较高吞吐量。多用于消息队列(多个线程发送消息,先随便发来)。 LinkedBlockedQueue内部基于锁,并提供了BlockingQueue的等待性方法(take、put),常用于任务队列(生产者消费者...原创 2019-02-21 23:18:10 · 1437 阅读 · 0 评论 -
Java并发类库中提供的线程池有哪几种
一、并发类库中的线程池线程是不能重复启动的,频繁创建和销毁线程存在一定的开销。为了减小这种开销,提高资源利用率,我们可以使用线程池,让线程进行复用。使用线程池后,创建线程相对于从线程池中获取一个空闲线程,销毁线程相对于向线程池归还线程。通常开发者都是利用Executors中的线程池创建方法创建线程池。通过指定不同的参数就可以创建出不同类型的线程池。Executors提供的线程池创建配置...原创 2019-02-22 15:06:20 · 628 阅读 · 0 评论 -
AtomicInteger的底层实现原理
一、AtomicInteger的底层实现原理AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS(compare-and -swap)技术。二、CASCAS算法的过程是这样的,它包含三个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N。如果V值和E值不同,说明已经有了...原创 2019-02-22 20:16:50 · 5923 阅读 · 1 评论 -
JVM内存区域的划分,哪些区域可能产生OutOfMemory
一、JVM内存区域划分通常可以把JVM内存区域划分为程序计数器,虚拟机栈,本地方法栈,堆,方法区,运行时常量池。其中,有的区域是以线程为单位,有的区域则是整个JVM进程唯一的。程序计数器。程序计数器是一块比较小的内存区域,可以看做当前线程执行的字节码的行号指示器。在JVM规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行。 Java虚拟机栈。每个线程在创建时...原创 2019-02-23 13:54:36 · 821 阅读 · 0 评论 -
诊断和监控JVM堆内和堆外内存使用
一、如何诊断和监控JVM堆内核堆外内存使用可以使用综合性的图形化工具,如JConsole 可以使用命令行工具进行运行时查询,如 jstat 和 jmap ,可以查看堆,方法区等使用数据。 可以使用jmap等提供的命令,生成堆转储(Heap Dump)文件,然后利用 jhat 等堆转储分析工具进行详细分析二、堆内部结构对于堆内存,最常见的是新生代和老生代的划分。随着JVM的发展和新的G...原创 2019-02-23 15:01:19 · 1139 阅读 · 0 评论 -
Java常见的垃圾收集器有哪些
一、Java常见的垃圾收集器Serial GC,它是最古老的垃圾收集器,采用复制算法,收集新生代垃圾。“Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入“Stop-The-World”状态。当然,其单线程也意味着精简的GC实现,无需维护复杂的数据结构,初始化也简单,所以一直是Client模式下JVM的默认选项。 Serial Old,Serial Old是Seria...原创 2019-02-23 19:39:38 · 912 阅读 · 0 评论 -
Java内存模型中的happen-before
一、Java内存模型中的happen-before是什么Happen-before关系,是Java内存模型中保证多线程操作可见性的基础。具体表现为:线程内执行的每个操作,都保证happen-before后面的操作。这就保证了基本的程序执行顺序,是开发者在书写程序时的基本约定。 对于volatile变量,对于它的写操作,保证happen-before在随后对该变量的读取操作 对于一个锁的...原创 2019-02-23 20:07:20 · 298 阅读 · 0 评论 -
类加载机制
一、类加载过程虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是类加载机制。Java的类加载过程主要分为三个步骤:加载、链接、初始化。首先是加载阶段。它是Java将字节码数据从不同的数据源加载到JVM中,并映射为JVM认可的数据结构(Class对象),数据源可能是jar文件,class文件,网络数据流...原创 2019-02-23 21:42:26 · 222 阅读 · 0 评论 -
Java基础知识
一、Java平台概述Java是一种面向对象的语言,有两个特征。一是“一次编译,到处运行”,获取了跨平台的能力。二是垃圾回收机制,JVM自动进行垃圾回收,不需要手动释放。我们日常接触的JRE就是Java运行环境,包括JVM和Java类库。JDK是Java开发工具集,是JRE的超集,除了JVM和Java类库,还包括一些其他工具。Java是解释执行,这句话不太准确。通常我们开发的Java代码...原创 2019-02-24 11:33:50 · 160 阅读 · 0 评论 -
设计一个秒杀系统
一、理解秒杀系统要做一个秒杀系统,首先要理解秒杀系统。秒杀系统主要解决两个问题,一个是并发读,一个是并发写。并发读的核心优化概念是尽量减少用户到服务端来读数据,或者让用户读更少的数据。并发写的处理原则也一样,它要求我们在数据库层面独立出来一个库,做特殊的处理。二、秒杀系统设计原则秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统。对于秒杀系统,请求数据要尽量少,路径要尽量短,...原创 2019-02-24 21:52:20 · 278 阅读 · 0 评论 -
脚踏两只船的困惑--Memcached和Redis
一、Memcached与Redis的区别Memcached:一款完全开源、高性能、分布式的内存系统Redis:一个开源的,Key-Value型、基于内存运行并支持持久化的NoSQL数据库。从概念上来看,Memcached和Redis并非是一对“孪生兄弟”,能将二者联系起来的纽带就是内存。从诞生之初起,二者的目标就有差异。Memcached追求高性能的内存服务,而Redis不仅支持内存服...转载 2019-02-25 11:17:21 · 320 阅读 · 0 评论 -
数据库复习
一、数据库连接池原理为什么需要使用数据库连接池。像打开和关闭数据库连接这种操作是很耗时的,当客户端数量增加的时候会造成瓶颈。为了解决此问题,将所有连接形成一个连接池。用户需要连接时从连接池中获取一个连接,使用结束后归还连接。连接池的工作原理一般由三部分组成,分别是连接池的建立,连接池中连接的管理分配,连接池的关闭。1.连接池的建立。一般在系统初始化的时候,连接池会根据配置建立,建立几个...原创 2019-03-07 13:22:38 · 472 阅读 · 0 评论