Skip to content

Commit e929ea3

Browse files
committed
change image
1 parent ae6a8bc commit e929ea3

File tree

7 files changed

+84
-11
lines changed

7 files changed

+84
-11
lines changed

docs/JavaMultiThread.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#### [1.进程与线程的区别是什么?](#进程与线程的区别是什么?)
55
#### [2.进程间如何通信?](#进程间如何通信?)
6+
67
#### [3.Java中单例有哪些写法?](#Java中单例有哪些写法?)
78
#### [4.Java中创建线程有哪些方式?](#Java中创建线程有哪些方式?)
89
#### [5.如何解决序列化时可以创建出单例对象的问题?](#如何解决序列化时可以创建出单例对象的问题?)

docs/Lock.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -230,26 +230,30 @@ ReentrantLock的非公平锁与公平锁的区别在于非公平锁在CAS更新s
230230

231231
**不同点:**
232232

233-
1.实现原理
233+
**1.实现原理**
234234

235-
synchronized是一个Java 关键字,synchronized锁是JVM实现的,底层代码应该是C++代码。而ReenTrantLock是JDK实现的,是Java提供的一个类库,代码是Java代码,源码实现更加方便阅读。
235+
synchronized是一个Java 关键字,是由JVM实现的,底层代码应该是C++代码。而ReentrantLock是JDK实现的,是Java提供的一个类库,代码是Java代码,源码实现更加方便阅读。
236236

237-
2.性能
237+
**2.性能**
238238

239-
在以前,synchronized锁的实现只有重量级锁一种模式,性能会比较差,后面引入了偏向锁和轻量级锁后就优化了很多。
239+
在以前,synchronized锁的实现只有重量级锁一种模式,性能会比较差,后面引入了偏向锁和轻量级锁后就优化了很多。根据测试结果,在线程竞争不激烈的情况下,ReentrantLock与synchronized锁持平,竞争比较激烈的情况下,ReentrantLock会效率更高一些。
240240

241-
3.功能
241+
**3.功能**
242242

243-
synchronized只能修饰方法,或者用于代码块,而ReenTrantLock的加锁和解锁是调用lock和unlock方法,更加灵活。
243+
synchronized只能修饰方法,或者用于代码块,而ReentrantLock的加锁和解锁是调用lock和unlock方法,更加灵活。
244244

245-
其次是synchronized的等待队列只有一个(调用wait()方法的线程会进入等待队列),而ReenTrantLock可以有多个条件等待队列。可以分组唤醒需要唤醒的线程们,而不是像synchronized要么用notify方法随机唤醒一个线程要么用notifyAll方法唤醒全部线程。ReenTrantLock 提供了一种能够中断等待锁的线程的机制,就是线程通过调用lock.lockInterruptibly()方法来加锁时,一旦线程被中断,就会停止等待。
245+
其次是synchronized的等待队列只有一个(调用wait()方法的线程会进入等待队列),而ReentrantLock可以有多个条件等待队列。可以分组唤醒需要唤醒的线程们,而不是像synchronized要么用notify方法随机唤醒一个线程要么用notifyAll方法唤醒全部线程。ReentrantLock 提供了一种能够中断等待锁的线程的机制,就是线程通过调用lock.lockInterruptibly()方法来加锁时,一旦线程被中断,就会停止等待。
246246

247-
ReenTrantLock可以使用tryLock(long timeout, TimeUnit unit)方法来尝试申请锁,设置一个超时时间,超过超时时间,就会直接返回false,而不是一直等待锁。
247+
ReentrantLock可以使用tryLock(long timeout, TimeUnit unit)方法来尝试申请锁,设置一个超时时间,超过超时时间,就会直接返回false,而不是一直等待锁。
248248

249-
4.公平性
249+
ReentrantLock可以响应中断,而synchronized锁不行
250+
251+
**4.公平性**
250252

251253
synchronized锁是非公平锁,ReentrantLock有公平锁和非公平锁两种模式。
252254

255+
https://www.codercto.com/a/22884.html
256+
253257
### ReentrantLock的加锁流程是怎么样的?
254258

255259
ReentrantLock非公平锁的加锁流程:
@@ -276,6 +280,8 @@ ReentrantLock非公平锁的加锁流程:
276280

277281
https://blog.csdn.net/qq_14996421/article/details/102967314
278282

283+
https://blog.csdn.net/fuyuwei2015/article/details/83719444
284+
279285
### 谈一谈你对AQS的理解?
280286

281287
AQS是AbstractQueuedSynchronizer的缩写,是一个抽象同步队列类,可以基于它实现一个锁,例如ReentrantLock,只是需要实现tryAcquire()方法(也就是获取资源的方法,判断当前线程能否申请到独占锁)和tryRelease()方法(也就是释放资源的方法,在线程释放锁前对state进行更新),AQS会根据tryAcquire()的返回结果,来进行下一步的操作,

docs/MySQLNote.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,43 @@ https://blog.csdn.net/dennis211/article/details/78170079
10661066

10671067
因为大查询在查询时可能会锁住很多数据,也需要获取到这些数据的行锁才能进行查询,切分成小查询可以减少锁竞争,减少等待获取锁的时间。
10681068

1069+
##### 1.使用show profile对一条SQL查询分析当前会话中语句执行的资源消耗情况
1070+
1071+
1.profiling配置默认是不开启的,可以使用set profiling = ON;命令将配置暂时打开。
1072+
1073+
2.执行一条查询SQL
1074+
1075+
3.使用show profiles可以查看最近15条查询SQL及对应的查询idquery id
1076+
1077+
4.假设查询id为9,使用这个命令show profile for query 9;可以查看每个步骤及其消耗的时间。
1078+
1079+
```
1080+
mysql> show PROFILE for QUERY 9;
1081+
+----------------------+----------+
1082+
| Status | Duration |
1083+
+----------------------+----------+
1084+
| starting | 0.000054 |
1085+
| checking permissions | 0.000007 |
1086+
| Opening tables | 0.000116 |
1087+
| init | 0.000019 |
1088+
| System lock | 0.000009 |
1089+
| optimizing | 0.000004 |
1090+
| statistics | 0.000011 |
1091+
| preparing | 0.000010 |
1092+
| executing | 0.000002 |
1093+
| Sending data | 0.000061 |
1094+
| end | 0.000005 |
1095+
| query end | 0.000006 |
1096+
| closing tables | 0.000006 |
1097+
| freeing items | 0.000031 |
1098+
| cleaning up | 0.000010 |
1099+
+----------------------+----------+
1100+
```
1101+
1102+
https://www.cnblogs.com/116970u/p/11004431.html
1103+
1104+
https://www.jianshu.com/p/1efdddf3d461
1105+
10691106
### char类型与varchar类型的区别?
10701107

10711108
char类型

docs/Nginx.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,4 +375,7 @@ Demo3.抢购场景降级
375375
3)(integer)14 # 漏斗剩余容量
376376
4)(integer)-1 # 被拒绝之后,多长时间之后再试(单位:秒)-1 表示无需重试
377377
5)(integer)2 # 多久之后漏斗完全空出来
378-
```
378+
```
379+
380+
381+

docs/RedisDataStruct.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ Redis中的简单动态字符串其实是对C语言中的字符串的封装和
2323

2424
2.频繁修改一个字符串时,会涉及到内存的重分配,比较消耗性能。(Redis中的简单动态字符串会有内存预分配和惰性空间释放)。
2525

26+
**如果字符串实际使用长度len<1M**,实际分配空间=len长度来存储字符串+1字节存末尾空字符+len长度的预分配空闲内存
27+
28+
**如果字符串实际使用长度len>1M**,实际分配空间=len长度来存储字符串+1字节存末尾空字符+1M长度的预分配空闲内存
29+
2630
所以Redis中的简单动态字符串结构,除了包含一个字符数组的属性,还包含数组的长度,数组的实际使用长度等属性,通过增加长度属性,可以保证字符串是二进制安全的,从而可以保存任意类型的数据,例如一张图片,对象序列化后的数据等等。
2731

2832
##### 字符串使用场景如下:

docs/linux.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,26 @@ https://www.cnblogs.com/aspirant/p/11543456.html
1515
### 僵尸进程和孤儿进程是什么?
1616
僵尸进程就是子进程调用exit退出或者是运行时发生致命错误,结束运行时,一般会把进程的退出状态通知给操作系统,操作系统发送SIGCHLD信号告诉父进程“子进程退出了”,父进程一般会使用wait系统调用以获得子进程的退出状态,这样内核就可以在内存中释放子进程了,但是如果父进程没有进行wait系统调用,子进程就会驻留在内存,成为僵尸进程。
1717

18-
孤儿进程就是父进程退出,但是它的子进程还在进行,这些子进程就会变成孤儿进程,被init进程(进程号为1)所收养,由它来管理和收集子进程的状态。由于孤儿进程有init进程循环的wait()调用回收资源,所以不会产生什么危害。
18+
孤儿进程就是父进程退出,但是它的子进程还在进行,这些子进程就会变成孤儿进程,被init进程(进程号为1)所收养,由它来管理和收集子进程的状态。由于孤儿进程有init进程循环的wait()调用回收资源,所以不会产生什么危害。
19+
20+
##### Linux指令使用
21+
22+
统计access.log中ip访问次数前十的
23+
24+
```
25+
cat access.log | awk '{ print $1}' | sort -n | uniq -c | sort - r |head 10
26+
```
27+
28+
统计当前目录下(包含子目录) java 的文件的代码总行数。
29+
30+
```
31+
wc -l `find . -name "*.java"` | awk '{ sum=sum+$1 } END { print sum }'
32+
```
33+
34+
### Linux进程间通信的方式?
35+
36+
《Linux 的进程间通信》 https://zhuanlan.zhihu.com/p/58489873
37+
38+
浅析进程间通信的几种方式(含实例源码) https://zhuanlan.zhihu.com/p/94856678
39+
40+
https://mp.weixin.qq.com/s/WgZaS5w5IXa3IBGRsPKtbQ

static/qe222wewewqere.jpeg

874 Bytes
Loading

0 commit comments

Comments
 (0)