- 博客(156)
- 收藏
- 关注
翻译 问十九:yield函数的作用?
* A hint to the scheduler that the currentthread is willing to yield* its current use of a processor. The scheduleris free to ignore this* hint.hint:暗示scheduler:调度器yield:退让,让出is free...
2019-05-02 16:35:49
480
原创 问十八:什么是重入?
如果有一个互斥锁,当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但是如果一个线程再次请求自己持有的对象锁临界资源时,将会成功,而不会进入阻塞状态。比如synchronized实现的锁机制,如果修饰代码块的话,它在字节码中就会有显示获取monitor锁的语义,而这个monitor在OpenJDK的源代码中可以看到它有一个_count和_owner的字段定义。大...
2019-05-02 16:35:13
387
原创 问十七: synchronized与lock的区别是什么?
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;...
2019-05-02 16:34:52
242
原创 问十六:synchronized与volatile的区别?
1)volatile本质是告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取,不会造成线程阻塞。synchronized则是锁定当前变量,只有当前线程可以访问该变量,其它线程被阻塞。2)volatile仅能使用在变量级别,synchronized则可以使用在变量、方法。3)volatile仅能实现变量修改的可见性,而synchronized则可以保证变量修改的可见性和原子性。...
2019-05-02 16:33:29
398
原创 问十五:说说你了解的volatile?
volatile作用,实现原理,运用场景:①作用:volatile只能保证多线程三大特性中的可见性和有序性。1)可见性:每个线程都有一个自己的本地内存,对于共享变量,线程每次读取和写入的都是共享变量在本地内存中的副本,然后在某个时间点将本地内存和主内存的值进行同步。而当修改volatile修饰的变量后,volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,会强制把对变量的修改...
2019-05-02 16:33:01
303
原创 问十四:说说synchronized的膨胀方向?
synchronized的四种状态无锁、偏向锁、轻量级锁、重量级锁锁膨胀方向:无锁→偏向锁→轻量级锁→重量级锁偏向锁:减少同一线程获取锁的代价多数情况下,锁不存在多线程竞争,总是由同一线程获得如果一个线程获得了锁,那么锁就进入偏向模式,此时Mark Word的结构就变成了偏向锁结构,当该线程再次请求锁时,无需再做任何同步操作,获取锁的过程只需要检测Mark Word的锁标...
2019-05-02 16:32:25
332
原创 问十三:synchronized底层实现是什么样的?
早期synchronized:Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。这种依赖于操作系统Mutex Lock所实现的...
2019-05-02 16:31:16
255
原创 问十二:说说你了解到的java线程池?
1.线程池优点第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。2. 源码分析 1)线程池的创建在创建线程池时会...
2019-05-02 16:29:40
301
原创 问十一:sleep和wait的区别有哪些?
sleep与wait的区别1. 这两个方法来自不同的类分别是Thread.wait()和Object.sleep()2. sleep必须捕获异常,而wait不需要捕获异常3. wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用4. 最主要是Thread.sleep方法只会让出CPU资源,而没有释放锁,Object.wait方法不仅让出了CPU资源,也释...
2019-05-02 16:28:40
197
1
原创 问十:源码层面解析Thread中run()和start()的区别?
分析start()的源码:调用start0()方法 是一个native方法进入http://hg.openjdk.java.net/jdk8u源码页查看其native方法的源码进入share目录,找到Thread.c发现其调用了JVM_StartThread方法通过查看其顶部引用,定位jvm.h进入jvm.h进行查看在JVM_S...
2019-05-01 10:15:34
321
原创 问九:源码层面解析Thread.sleep()为什么需要抛异常?
结合此篇文章进行阅读:InterruptedExcption详细分析导入:Thread.sleep()抛的是InterruptedException,这个错误在源码中的注释为:* Thrown when a thread is waiting, sleeping, orotherwise occupied,* and the thread is interrupted, e...
2019-05-01 10:15:05
7189
2
原创 问八:InterruptedExcption详细分析?
当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法抛InterruptedException的代表方法有:1. java.lang.Object 类的 wait 方法2. java.lang.Thread 类的 sleep 方法3. java.lang.Thread 类的 join 方法需要...
2019-05-01 10:14:25
484
1
原创 问七:如何中断一个线程?
已经被抛弃的方法:通过调用stop()通过调用suspend()和resume()方法废弃原因(再写具体一点):太过暴力,可能会导致一些清理工作不会完成调用后会直接释放锁,可能会导致数据不同步的问题https://www.jianshu.com/p/e0ff2e420ab6目前使用的方法:调用interrupt(),通知线程应该中断1.如果线程处于阻塞状...
2019-05-01 10:14:03
770
原创 问六:实现线程的四种方式?
1.继承Thread类创建线程2.实现Runnable接口创建线程3.使用Callable和Future创建线程4.通过线程池实现线程创建的目的注:一般实现接口创建接口* Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口;* 类可能只要求可执行就行,继承整个 Thread 类开销过大。1)继承Thread类创建线程...
2019-05-01 10:13:29
188
原创 问五:JAVA线程的六种状态及所有切换途径?
参考源码注解进行修改添加Thread.State六个状态详解新建(New):创建后还没有启动的线程状态运行(Runnable):线程正在JVM中执行的状态,但它可能正在等待来自操作系统的其他资源(例如处理器资源)因此包含Running和Ready状态阻塞(Blocked):处于阻塞状态的线程正在等待monitor锁的状态无限期等待(Waiting):不会分配CPU执行时...
2019-05-01 10:12:37
201
原创 问四:进程与线程的区别?
两者区别:1.资源拥有:进程是资源分配的最小单位,线程是CPU调度的最小单位,同一个进程中的线程共享本进程中的资源(如内存、CPU、IO等),进程间资源独立2.地址空间:同一个进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间3.执行方面:进程可以看做一个独立应用来单独执行,而线程则必须依托与进程执行4.系统开销:进程切换消耗资源更多、开销更大(用户态与内核态的切换)...
2019-05-01 10:12:01
186
转载 问三:产生死锁的四个条件?
Java多线程中的死锁死锁是指两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。死锁的发生必须满足以下四个条件:互斥条件:一个资源每次只能被一个进程使用请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺循环等待条件:若干进程之间形成一...
2019-05-01 10:11:31
233
原创 问二:线程安全诱因及概念?
线程安全性的定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。主要诱因:存在可变的共享数据,并且同时有多条线程共同操作这些资源实现线程安全:线程封闭:线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。...
2019-05-01 10:11:07
165
原创 问一:进程和线程间通讯方式?
操作系统层面的进程间通讯①管道存在于内存中,进程可以对它进行读写,提供流控机制,保证进程的正确读写(管道为空读阻塞,管道为满写阻塞)②消息队列类似于管道,但不止能够传输字节流,没有缓冲区大小限制。同时独立于进程,进程终止时消息队列及其内容不会被删除,实现消息随机读取③套接字(socket)可用于不同机器间的进程通信(即网络间进程通信)④信号量(Semaphore)一...
2019-05-01 10:10:32
210
原创 八:求两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。一般的思路是找出两个链表长度的差值,然后长的先跑完差值,最后和着短的链表一起跑,这样必然能够来到第一个公共结点但是这里有个问题,就是不能够保证这个链表是无环的,如果有环的话,在判断链表长度差值的时候,因为一直不能得到null,所以会陷入死循环。所以可以先判断是否有环,这个的判断可以通过两种方式,第一种是hashmap或者hashset的...
2019-04-28 15:02:23
144
原创 六:关于冒泡排序的三种实现方式
我们知道一般的冒泡排序是指:1、将一个数与它后面的那一个数进行比较,如果前面>后面,则两者交换位置。2、对数组中的每一个数都进行这样的操作,一个循环下来最大的数值就会到达数组的最后面。3、再将数组范围缩小一个(即再次比较时不看数组最后且最大的那个),再次循环上面的步骤。(因为1,2,3,6,1在12循环后是1,2,3,1,6 如果不继续进行循环,则答案错误)当数组的...
2019-04-28 15:01:09
788
原创 五:关于递归需要返回多个信息
输入一棵二叉树,判断该二叉树是否是平衡二叉树。这道题在递归的时候需要返回两个信息,第一个是否是平衡二叉树,第二个是它的高度遇到这种题可以将它需要的这些信息封装成一个对象,返回值也是这个对象,就能够通过递归快速写代码来实现了...
2019-04-28 14:58:45
766
原创 四:master公式
master公式的使用T(N) = a*T(N/b) + O(N^d)1) log(b,a) > d -> 复杂度为O(N^log(b,a))2) log(b,a) = d -> 复杂度为O(N^d * logN)3) log(b,a) < d -> 复杂度为O(N^d) a是分组后,运用到递归操作的样本的操作次数b是总样本量分...
2019-04-28 14:58:04
289
原创 三:堆排序详解
X(大或小)根堆的构建:堆的本质就是一棵完全二叉树(大根堆:树中任意一个子树的最大值都是它的头部组成的树)一个大根堆或者小根堆,它的创建过程:参考完全二叉树父子节点之间的关系(父节点为i,则左孩子为2*i+1,右孩子为2*i+2),就可以对数组进行构建,通过对数组元素的移动,来达成大根堆的构建。比如数组[3, 1, 2, 5, 0],构建一个小根堆相关的时间复杂度:新添...
2019-04-28 14:56:55
196
原创 二:常用树的概念与区别
满二叉树一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。完全二叉树二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。堆的本质就是一棵完全二叉树(大根堆:树中任意一个子树的最大...
2019-04-28 14:55:57
222
转载 问三:页面置换算法有哪些?
概述:在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。页面置换算法的主要目标是使页面置换频率最低(也可以说...
2019-04-26 13:25:30
1014
转载 问二:分段&段页式有什么区别?
一、分段虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。下图为一个编译器在编译过程中建立的多个表,有 4 个表是动态增长的,如果使用分页系统的一维地址空间,动态增长的特点会导致覆盖问题的出现。分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。二、段页式程序的地址空间划...
2019-04-26 13:24:52
345
转载 问一:说说进程调度算法有哪些?
1、先来先服务(FCFS)处于就绪态的进程按先后顺序链入到就绪队列中,而FCFS调度算法按就绪进程进入就绪队列的先后次序选择当前最先进入就绪队列的进程来执行,直到此进程阻塞或结束,才进行下一次的进程选择调度。FCFS调度算法采用的是不可抢占的调度方式,一旦一个进程占有处理机,就一直运行下去,直到该进程完成其工作,或因等待某一事件而不能继续执行时,才释放处理机。操作系统如果采用这种进程调度方...
2019-04-26 13:24:29
4394
转载 问十五:MyISAM与InnoDB如何加锁?
1.MyISAM默认使用的是表级锁,不支持行级锁2.InnoDB默认用的是行级锁,也支持表级锁MyISAM不支持事物InnoDB支持事物表级锁就是在一个session访问的时候,MyISAM会将整个表给锁起来(读锁),如果有新session对这个表进行增删改时(写锁),会被阻塞比如在一个session中手动加锁:在另一个session中写:就会失...
2019-04-26 13:22:56
274
原创 附:数据库常用操作
建个表(User):idnamepasswordsalthead_url【用户头像】CREATE TABLE `user`(`id` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(64) NOT NULL DEFAULT '',`salt` VARCHAR(32) NOT NULL DEFAULT '',`hea...
2019-04-26 13:21:39
169
转载 问十四:char和varchar的区别是什么?
首先明确的是,char的长度是不可变的,而varchar的长度是可变的。定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,char的存取数度还是要...
2019-04-26 13:21:00
305
原创 问十三:说说数据库范式?
1NF:强调的是列的原子性,即一个列不能再分成其它几列。2NF:首先强调必须满足1NF,其次满足:一是表必须包含主键;而是非主键的列不能部分依赖主键,必须完全依赖。3NF:首先遵循前面两个范式,同时任何非主属性不依赖其它非主属性(即非主属性之间不能相互依赖)。范式化设计的优点:避免数据库冗余(在范式化设计中一个数据只出现一次,相反在反范式设计中数据可能会被冗余...
2019-04-26 13:20:23
191
转载 问十二:如何优化一个索引?
1. 独立的列在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。例如下面的查询不能使用 actor_id 列的索引:SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;2. 多列索引当查询条件有多个字段时,单列索引和多列索引有很大的区别。如果使用多列索引,where条件中字段的顺序...
2019-04-26 13:19:32
492
原创 问十一:解释一下如何查看慢日志和explain?
1.根据慢日志(记录执行的慢的sql的日志)定位慢查询sqlSHOW VARIABLE LIKE '%query%'SHOW STATUS LIKE 'slow_queries' 查询慢查询有几条SET GLOBAL slow_query_log = ON开启慢查询SET GLOBAL long_query_time = 1 设置慢查询记录时间为1s也可以在...
2019-04-26 13:18:34
378
转载 问十:说说常见HTTP状态码?
说说常见HTTP状态码吧?1XX 信息* 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。2XX 成功* 200 OK服务器已成功处理了请求并提供了请求的网页*202 Accepted已经接受请求,但处理尚未完成。* 204 No Content请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需...
2019-04-24 11:13:59
492
转载 问八:TCP 拥塞控制是什么?
拥塞算法,拥塞定义如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量...
2019-04-24 11:13:01
1509
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅