- 博客(126)
- 资源 (5)
- 收藏
- 关注
原创 redis面试题大全
启动redis前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法redis的概述服务器处理数据的速度,与网站速度息息相关. 但是如果网站的访问量非常大的时候,我们的数据库压力就变大了。数据库的连接池、处理数据的能力就会面临很大的挑战。我们日常使用的关系型数据库中的数据,全部存储在我们部署数据库的机器的硬盘中。缓存就是在内存中存储的数据备份,当...
2018-11-12 10:55:46
58071
4
原创 数据库的优化思路
①合理选择数据库引擎②sql语句的优化③索引的优化④分库分表分区⑤预处理⑥读写分离⑦数据库表结构设计(1)尽量使用数字型字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。(2)尽可能的使用 varchar 代替 char因为首先变长字段存...
2018-11-11 09:31:03
609
1
原创 mysql的分页
mysql提供了分页的函数limit m,n 其中m代表起始行,n代表总行数.我们还可以根据实际情况来改写我们的分页语句.如果只给定一个参数,表示记录数查询5行记录,起始行从0开始(即从第一行开始)SELECT * FROM emp LIMIT 0, 5; =>等价于 select * from emp limit 5;客户端通过传递start(页码),pageSize(每页显...
2018-11-11 09:30:11
5388
原创 InnoDB的关键特性
1.插入缓冲,主要是针对非主键索引的插入和更新操作,如果是主键索引,顺序的插入就可以了,数据页的存放还是主键id的执行顺序,但是非主键索引,叶子节点的插入不再是顺序的,这个时候需要离散的访问非聚集索引,插入性能会变得很低。 插入缓冲的作用就是,对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是先判断非聚集索引页是否里,如果存在,那么直接插入,不存在就先插入到缓冲池中,然后以一定的...
2018-11-11 09:29:43
467
原创 MySql何时用MyISAM何时用InnoDB
MySql何时用MyISAM何时用InnoDBMyISAM和InnoDB是MySQL提供的两种搜索引擎MyISAM和InnoDB的区别①InnoDB支持事务与外键和行级锁,MyISAM不支持(最主要的差别)②MyISAM读性能要优于InnoDB,除了针对索引的update操作,MyISAM的写性能可能低于InnoDB,其他操作MyISAM的写性能也是优于InnoDB的,而且可...
2018-11-11 09:28:59
6172
原创 数据库索引
引言说白了,数据库的索引问题就是查找问题数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据.索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树)除了数据之外,数据库系统还维护为满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这种数据结构就是索引创建索引的好处①通过创建索引,可以在查询的过程中,提高系统的性能②...
2018-11-11 09:27:25
66495
5
原创 B树(或B-树)和B+树和B*树
树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下根据平衡二叉树的启发,自然就想到平衡多路查找树结构,即B树结构(后面,我们将看到,B树的各种操作能使B树保持较低的高度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率)。为什么说B+tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?1) B+tree的磁盘读写代价更低B+tree的内部结点...
2018-11-11 09:16:04
365
原创 数据库事务的特性和隔离级别
数据库事务的四大特性(ACID)原子性(Atomicity)事务中的操作要么全部成功,要么失败回滚一致性(Consistency)一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。隔离性(Isolation)两...
2018-11-11 09:15:10
465
原创 mysql中char和varchar和text的区别
①CHAR是一种固定长度的类型,适合用在身份证号码、手机号码等定。,VARCHAR则是一种可变长度的类型。适合用在长度可变的属性。 text不设置长度, 当不知道属性的最大长度时,适合用text。②按照查询速度: char最快, varchar次之,text最慢。也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字...
2018-11-11 09:13:23
14465
原创 ThreadLocal详解
ThreadLocal概要我们可以使用synchorinized 关键字来为变量加锁以解决线程安全问题,从而限制只能有一个线程来使用此变量,但是加锁会大大影响程序执行效率ThreadLocal是线程局部变量(从线程的角度看,目标变量就像是线程的本地变量), 通常是类中的 private static 字段. 当ThreadLocal维护变量的时候,为每一个使用该变量的线程都提供一个独立的变...
2018-11-10 19:48:05
447
原创 如何实现自己的线程池
首先,在服务启动的时候,我们可以启动好几个线程,并用一个容器(如线程池)来管理这些线程。当请求到来时,可以从池中取一个线程出来,执行任务(通常是对请求的响应),当任务结束后,再将这个线程放入池中备用;如果请求到来而池中没有空闲的线程,该请求需要排队等候。最后,当服务关闭时销毁该池即可。public interface Pool {//获取工作线程public abstract Pool...
2018-11-10 19:45:04
1142
原创 ThreadPoolExecutor详解
构造器参数分析第四个构造器源码corePoolSize:核心池的大小默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数数目少于corePoolSize时,有新任务进来就新建一个线程,即使有的线程没事干,当线程池中的线程数目达到corePoolSize时,将到达的任务放在缓存队列中可以理解为:队列没满时,线程最大...
2018-11-10 19:43:47
1419
原创 java中常见的线程池
Executor接口表示线程池,它的execute(Runnable task)方法用来执行Runnable类型的任务,ExecutorService是Executor的子接口,声明了管理线程池的一些方法Java.util.concurrent.Executors类包含了一些静态方法,它们负责生成各种类型的线程池实例(ExecutorService) ①newSingleThrea...
2018-11-10 19:36:44
284
原创 线程池的优点
①降低资源消耗-->重复利用已经创建的线程②提高响应速度-->当任务到达时,任务可以直接从线程池获取线程,而不需要创建新的线程③提高线程的可管理性-->使用线程池可以统一分配,调优和监控,例如可以根据系统的承受能力,调增线程池中工作线程的数目...
2018-11-10 19:35:52
761
原创 线程数设多少合适
①工作线程数是不是设置的越大越好? 回答:肯定不是的 1)一来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个工作线程没有意义 2)线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低②如果CPU是单核,设置多线程有意义么,能提高并发性能么? 回答:即使是单核,使用多线程也是有意义的 ...
2018-11-10 19:35:09
7350
原创 谈谈你对CountDownLatch的理解
CountDownLatch是java.util.concurrent包中一个工具类。它能够使一个或者多个线程等待另外一些线程完成各自的工作之后,再继续执行使用CountDownLatch的一些情景:①需要去解析一个Excel的数据,为了更快的解析,每个sheet都使用一个线程进行解析,但是最后汇总数据的工作需要等待每个sheet的解析工作完成之后才能进行②开启多个线程分块传输一个大数...
2018-11-10 19:34:42
1034
原创 LongAdder和AtomicLong的区别
AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用自循(CLH)方式不断地cas到特定的值,从而达到更新数据的目的。然而在线程竞争激烈的情况下,自循往往浪费很多计算资源才能达成预期效果。 面对自循的缺点,jdk1.8推出了LongAdder类,他的实现方式有点像ConcurrentHashMap一样,采用空间换时间的方式,提高在线程竞争激烈的...
2018-11-10 19:34:15
1434
原创 谈谈你对AtomicInteger的理解
AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。十分适合高并发情况下的使用 对于全局变量的数值类型操作 num++,若没有加synchronized关键字则是线程不安全的,num++解析为num=num+1,明显,这个操作不具备原子性,多线程时必然会出现问题。测试下:输出的结果为count: 9992,这个值不定,每次测试都可能不一样,很...
2018-11-09 08:15:17
6027
2
原创 如何线程安全地实现一个计数器
i++是线程安全的吗 i++和++i的线程安全分为两种情况:1、如果i是局部变量(在方法里定义的),那么是线程安全的。因为局部变量是线程私有的,别的线程访问不到,其实也可以说没有线程安不安全之说,因为别的线程对他造不成影响。2、如果i是全局变量(类的成员变量),那么是线程不安全的。因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。如何线程安全地实现一个计数器或者这...
2018-11-09 08:13:50
4145
原创 ReentrantLock可重入锁
ReentraantLock是通过一个FIFO的等待队列来管理获取该锁所有线程的。在“公平锁”的机制下,线程依次排队获取锁(先等待的线程先获得锁);而“非公平锁”在锁是可获取状态时,不管自己是不是在队列的开头都会获取锁。 ReentrantLock和synchronized的相同点①ReentrantLock和synchronized一样都具有可重入性ReentrantLock和s...
2018-11-09 08:12:10
885
原创 synchronized和Lock有什么区别
java语言中提供了两种锁机制来实现对某个共享资源的同步:synchronized和Lock.其中synchronized使用Object对象本身的notify,wait和notifyAll来实现线程之间的调度.而Lock可以使用Condition进程线程之间的调度①用法不同synchronized可以加在方法上,也可以加在特定的代码块中,括号中表示需要锁的对象Lock需要显式地指定起...
2018-11-09 08:11:06
1511
原创 终止线程的方法
在java语言中,可以使用stop()方法和suspend()方法来终止线程的执行.当使用Thread.stop()来终止线程时,它会释放已经锁定的所有监视资源,具有不安全性suspend()方法不会释放锁,容易发生死锁(两个或者两个以上进程在执行过程中,因争夺资源而造成进程间互相等待的现象,如果无外力干涉,它们将无法推进)问题鉴于以上两种方法的不安全性,java语言已经不建议使用以上...
2018-11-09 08:10:27
427
原创 sleep和yield方法的区别
①sleep方法给其他线程运行机会时不考虑线程的优先级,因此会给低线程优先级运行的机会,而yield方法只会给相同优先级或者更高优先级线程运行的机会②线程执行sleep()方法后转入阻塞状态,所以,执行sleep()方法的线程在指定的时间内不会被执行,而yield()方法只是使当前线程重新回到可执行状态,所以执行yield()方法的线程可能在进入可执行状态后马上又被执行③sleep()方法...
2018-11-09 08:09:44
7281
原创 sleep和wait方法的区别
①原理不同sleep()方法是Thread类的静态方法,它会使线程的执行暂停一段时间,把执行机会让给其他线程,等倒计时时间一到,此线程会自动苏醒wait()是Object类的方法,用于线程间的通信,使当前拥有锁的进程等待,直到其他线程调用notify()方法才醒过来②对锁的处理机制不同调用sleep()方法不释放锁(因为它不释放锁,所以容易导致死锁问题的发生,所以一般情况下,不推荐...
2018-11-09 08:09:08
498
原创 同步异步的区别
多个线程对同一个资源进行写操作,当线程A需要使用某个资源时,如果这个资源正在被B使用,同步机制会让A一直等待下去,直到线程B结束对该资源的使用后,线程A才能使用这个资源.由此可见,同步机制能够保证线程的安全如何实现同步操作呢?必须获得每一个线程对象的锁.获得它可以保证在同一时刻只有一个线程能够进入临界区(访问相同资源的代码块),并且在这个锁释放之前,其他线程不能进入这个临界区.如果还有线程...
2018-11-09 08:07:15
889
原创 线程调度的方式(简单易懂)
1.分时调度所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。2.抢占式调度优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。...
2018-11-09 08:06:30
6378
转载 线程的生命周期(线程的状态)
有执行资格:线程已经准备好有执行权:抢到了CPU的执行权在java语言中,线程有四种状态:运行,就绪,阻塞(或者说挂起)和结束(或者说死亡)
2018-11-09 08:05:20
206
原创 进程和线程的区别
①进程指正在运行的程序,是操作系统进行资源分配和调度的基本单位;线程是CPU调度的基本单位.②一个程序运行后至少有一个进程,一个进程中可以包含多个线程③进程具有自己独立的内存空间,各个线程之间共享进程的内存空间(堆和方法区)和一些进程级的资源(比如打开的文件),但是各个线程拥有自己的栈空间....
2018-11-08 21:54:17
212
原创 线程间的通信
在Java中主要通过等待唤醒机制来实现线程间的通信等待唤醒机制所涉及到的方法:wait() :等待,将正在执行的线程释放其执行资格 和 执行权,并存储到线程池中。 notify():唤醒,唤醒线程池中被wait()的线程,一次唤醒一个,而且是任意的。 notifyAll(): 唤醒全部:可以将线程池中的所有wait() 线程都唤醒。其实,所谓唤醒的意思就是让 线程池中的线程具备执行资...
2018-11-08 21:53:23
180
原创 进程间的通信机制
进程间的通信机制套接字:套接字socket,由目标计算机的IP地址和进程的端口号组成共享内存:由一个进程创建,但是多个进程可以访问消息队列:存放在内核中的消息链表信号:向接收进程通知某个事件已经发生信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源管道:半双工的通信方式,数据只能单向流动,...
2018-11-08 21:52:21
685
原创 进程的调度
为什么要进行进程的调度充分,高效,及时,公平利用CPU的资源可以在内存中存放数目远大于CPU数的进程进程调度的方式①非抢占式调度:一旦占用CPU,直到进程执行完成或者阻塞为止先来先服务算法优先级优先调度算法 ②抢占式调度:在一定情况下,可以剥夺另外一个进程占用的CPU时间片轮转调度算法优先级优先调度算法进程的调度算法①先来先服务算法(FC...
2018-11-08 21:51:35
551
1
原创 进程的状态
就绪态:进程已经准备好,只要分配到CPU就可以执行执行态:进程处于就绪态被调度后,进出进入执行状态阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓冲区失败)而暂时无法运行,进程进入阻塞态,当满足请求时进程进入就绪态...
2018-11-08 21:50:27
251
原创 并发(Concurrent)和并行(Parallel)和区别
并发单个处理器(CPU),轮换执行多个任务,因为轮换的速度比较快,看起来好像多个任务在同时执行一样并行多个处理器(CPU),同时执行多个任务,每个任务分配在一个处理器上执行并发就像是一个大人给两个婴儿喂饭,喂完这个喂那个;并行,就是两个大人分别同时给两个婴儿喂饭...
2018-11-08 21:49:48
1618
原创 使用java实现一个死锁程序
死锁:在java语言中,死锁是指在两个或者两个以上的线程执行的过程中,因争夺资源而产生的一种互相等待的现象同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。这种情况能避免就避免掉。synchronzied(A锁){synchronized(B锁){ }} ...
2018-11-08 21:46:28
754
原创 MySQL 中的行级锁、表级锁和页级锁
行级锁行级锁是 MySQL 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁分为共享锁和排他锁。特点:加锁开销大,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高页级锁页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。采取了折衷的页级锁,一次锁定相邻的一组记录。BDB 支持页级锁。特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定...
2018-11-08 21:45:27
1933
原创 CAS
尽管Java1.6为Synchronized做了优化,增加了从偏向锁到轻量级锁再到重量级锁的过度,但是在最终转变为重量级锁之后,性能仍然较低。所谓原子操作类,指的是java.util.concurrent.atomic包下,一系列以Atomic开头的包装类。例如AtomicBoolean,AtomicInteger,AtomicLong。它们分别用于Boolean,Integer,Long类型...
2018-11-08 21:44:31
266
原创 可重入锁
同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁,这就是可重入锁java里面内置锁(synchronized)和Lock(ReentrantLock)都是可重入的比如一个方法是synchronized,递归调用自己,那么第一次已经获得了锁,第二次调用的时候还能进入吗? 直观上当然需要能进入.这就要求必须是可重入的.可重入锁又叫做递归锁 public class Widg...
2018-11-07 09:58:01
1209
涵盖了90%以上的面试题
2018-11-02
包含图形推理和数字推理的解题技巧
2018-11-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人