Skip to content

Commit ffbe192

Browse files
committed
新增阿里面试点 xbox1994#17
1 parent 8f44078 commit ffbe192

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

MD/Java基础-多线程.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,41 @@ notifyAll:唤醒等待队列中等待该对象锁的全部线程,让其竞
4040

4141
**我们写同步的时候,优先考虑synchronized,如果有特殊需要,再进一步优化。ReentrantLock和Atomic如果用的不好,不仅不能提高性能,还可能带来灾难。**
4242

43+
#### 锁的种类
44+
* 公平锁/非公平锁
45+
46+
公平锁是指多个线程按照申请锁的顺序来获取锁
47+
ReentrantLock通过构造函数指定该锁是否是公平锁,默认是非公平锁。Synchronized是一种非公平锁
48+
49+
* 可重入锁
50+
51+
指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁
52+
ReentrantLock, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁
53+
Synchronized,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁
54+
55+
* 独享锁/共享锁
56+
57+
独享锁是指该锁一次只能被一个线程所持有。共享锁是指该锁可被多个线程所持有
58+
ReentrantLock是独享锁。但是对于Lock的另一个实现类ReadWriteLock,其读锁是共享锁,其写锁是独享锁
59+
读锁的共享锁可保证并发读是非常高效的,读写,写读 ,写写的过程是互斥的
60+
Synchronized是独享锁
61+
62+
* 乐观锁/悲观锁
63+
64+
悲观锁在Java中的使用,就是各种锁
65+
乐观锁在Java中的使用,是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新
66+
67+
* 偏向锁/轻量级锁/重量级锁
68+
69+
针对Synchronized的锁状态:
70+
偏向锁是为了减少无竞争且只有一个线程使用锁的情况下,使用轻量级锁产生的性能消耗。指一段同步代码一直被一个线程所访问,在无竞争情况下把整个同步都消除掉
71+
轻量级锁是为了减少无实际竞争情况下,使用重量级锁产生的性能消耗。指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过CAS自旋的形式尝试获取锁,不会阻塞
72+
重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁
73+
74+
* 自旋锁/自适应自旋锁
75+
指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU,默认自旋次数为10
76+
自适应自旋锁的自旋次数不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态决定,是虚拟机对锁状况的一个预测
77+
4378
### volatile
4479
功能:
4580

MD/Web框架-Spring.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,17 @@ Spring是个包含一系列功能的合集,如快速开发的Spring Boot,支
3030

3131

3232
### IOC(DI)
33-
控制反转:原来是自己主动去new一个对象去用,现在是由容器工具配置文件创建实例让自己用,以前是自己去找妹子亲近,现在是有中介帮你找妹子,让你去挑选,说白了就是用面向接口编程和配置文件减少对象间的耦合,同时解决硬编码的问题(XML)
33+
* 控制反转
3434

35-
依赖注入:在运行过程中当你需要这个对象才给你实例化并注入其中,不需要管什么时候注入的,只需要写好成员变量和set方法
35+
由 Spring IOC 容器来负责对象的生命周期和对象之间的关系。IoC 容器控制对象的创建,依赖对象的获取被反转了
36+
没有 IoC 的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转。但是有了 IoC 后,所依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转
37+
38+
* 依赖注入
39+
40+
组件之间依赖关系由容器在运行期决定,由容器动态的将某个依赖关系注入到组件之中,提升组件重用的频率、灵活、可扩展
41+
通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现
42+
43+
注入方式:构造器注入、setter 方法注入、接口方式注入
3644

3745
### Spring AOP
3846
#### 介绍

0 commit comments

Comments
 (0)