Skip to content

Commit cac33c7

Browse files
committed
Update Java Note
1 parent 83dba99 commit cac33c7

File tree

4 files changed

+20
-24
lines changed

4 files changed

+20
-24
lines changed

DB.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5644,7 +5644,8 @@ MySQL Server 是多线程结构,包括后台线程和客户服务线程。多
56445644
- 查看事务提交方式
56455645

56465646
```mysql
5647-
SELECT @@AUTOCOMMIT; -- 1 代表自动提交 0 代表手动提交
5647+
SELECT @@AUTOCOMMIT; -- 会话,1 代表自动提交 0 代表手动提交
5648+
SELECT @@GLOBAL.AUTOCOMMIT; -- 系统
56485649
```
56495650

56505651
- 修改事务提交方式
@@ -5732,8 +5733,8 @@ MySQL Server 是多线程结构,包括后台线程和客户服务线程。多
57325733
* 查询数据库隔离级别
57335734

57345735
```mysql
5735-
SELECT @@TX_ISOLATION;
5736-
SHOW VARIABLES LIKE 'tx_isolation';
5736+
SELECT @@TX_ISOLATION; -- 会话
5737+
SELECT @@GLOBAL.TX_ISOLATION; -- 系统
57375738
```
57385739

57395740
* 修改数据库隔离级别
@@ -5758,7 +5759,7 @@ InnoDB 存储引擎支持事务,所以加锁分析是基于该存储引擎
57585759

57595760
MySQL 做了优化,在 Server 层过滤条件时发现不满足的记录会调用 unlock_row 方法释放该记录的行锁,保证最后只有满足条件的记录加锁,但是扫表过程中每条记录的**加锁操作不能省略**。所以对数据量很大的表做批量修改时,如果无法使用相应的索引,需要在Server 过滤数据时就会特别慢,出现虽然没有修改某些行的数据,但是还是被锁住了的现象,这种情况同样适用于 RR
57605761

5761-
* Repeatable Read 级别,增删改操作会加写锁,读操作不加锁。因为读写锁不兼容,加了写锁后其他事务就无法修改数据,影响了并发性能,为了保证隔离性和并发性,MySQL 通过 MVCC 解决了读写冲突。RR 级别下的锁有很多种,锁机制章节详解
5762+
* Repeatable Read 级别,增删改操作会加写锁,读操作不加锁。因为读写锁不兼容,**加了读锁后其他事务就无法修改数据**,影响了并发性能,为了保证隔离性和并发性,MySQL 通过 MVCC 解决了读写冲突。RR 级别下的锁有很多种,锁机制章节详解
57625763

57635764
* Serializable 级别,读加共享锁,写加排他锁,读写互斥,使用的悲观锁的理论,实现简单,数据更加安全,但是并发能力非常差
57645765

@@ -6660,7 +6661,7 @@ InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是采用
66606661
- 共享锁 (S):又称为读锁,简称 S 锁,多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改
66616662
- 排他锁 (X):又称为写锁,简称 X 锁,不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,只有获取排他锁的事务是可以对数据读取和修改
66626663

6663-
RR 隔离界别下,对于 UPDATE、DELETE 和 INSERT 语句,InnoDB 会**自动给涉及数据集加排他锁**(行锁),在 commit 的时候会自动释放(在事务中加的锁,会**在事务中止或提交时自动释放**);对于普通 SELECT 语句,不会加任何锁(只是针对 InnoDB 层来说的,因为在 Server 层会加 MDL 读锁),通过 MVCC 防止冲突
6664+
RR 隔离界别下,对于 UPDATE、DELETE 和 INSERT 语句,InnoDB 会**自动给涉及数据集加排他锁**(行锁),在 commit 的时候会自动释放(在事务中加的锁,会**在事务中止或提交时自动释放**);对于普通 SELECT 语句,不会加任何锁(只是针对 InnoDB 层来说的,因为在 Server 层会** MDL 读锁**),通过 MVCC 防止并发冲突
66646665

66656666
锁的兼容性:
66666667

Java.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12677,7 +12677,7 @@ Java 语言:跨平台的语言(write once ,run anywhere)
1267712677

1267812678
字节码是一种二进制的类文件,是编译之后供虚拟机解释执行的二进制字节码文件,**一个 class 文件对应一个 public 类型的类或接口**
1267912679

12680-
字节码内容是 **JVM 的字节码指令**,不是机器码,C、C++ 经由编译器直接生成机器码,所以 C 执行效率比 Java 高
12680+
字节码内容是 **JVM 的字节码指令**,不是机器码,C、C++ 经由编译器直接生成机器码,所以执行效率比 Java 高
1268112681

1268212682
JVM 官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
1268312683

@@ -13860,7 +13860,7 @@ public static int invoke(Object... args) {
1386013860

1386113861
- 静态语言是判断变量自身的类型信息;动态类型语言是判断变量值的类型信息,变量没有类型信息
1386213862

13863-
- **Java 是静态类型语言**(尽管 lambda 表达式为其增加了动态特性),js,python是动态类型语言
13863+
- **Java 是静态类型语言**(尽管 Lambda 表达式为其增加了动态特性),JS,Python 是动态类型语言
1386413864

1386513865
```java
1386613866
String s = "abc"; //Java

Prog.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,18 @@
5050

5151
* 信号量:信号量是一个计数器,用于多进程对共享数据的访问,解决同步相关的问题并避免竞争条件
5252
* 共享存储:多个进程可以访问同一块内存空间,需要使用信号量用来同步对共享存储的访问
53-
* 管道通信:管道是用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件pipe 文件
54-
* 匿名管道(Pipes):用于具有亲缘关系的父子进程间或者兄弟进程之间的通信,只支持**半双工通信**
53+
* 管道通信:管道是用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件 pipe 文件,该文件同一时间只允许一个进程访问,所以只支持**半双工通信**
54+
* 匿名管道(Pipes):用于具有亲缘关系的父子进程间或者兄弟进程之间的通信
5555
* 命名管道(Names Pipes):以磁盘文件的方式存在,可以实现本机任意两个进程通信,遵循 FIFO
5656
* 消息队列:内核中存储消息的链表,由消息队列标识符标识,能在不同进程之间提供**全双工通信**,对比管道:
5757
* 匿名管道存在于内存中的文件;命名管道存在于实际的磁盘介质或者文件系统;消息队列存放在内核中,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才被真正删除
5858
* 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收
5959

6060
不同计算机之间的**进程通信**,需要通过网络,并遵守共同的协议,例如 HTTP
6161

62-
* 套接字:与其它通信机制不同的是,它可用于不同机器间的互相通信
62+
* 套接字:与其它通信机制不同的是,可用于不同机器间的互相通信
6363

64-
* 线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量
64+
* 线程通信相对简单,因为线程之间共享进程内的内存,一个例子是多个线程可以访问同一个共享变量
6565

6666
**Java 中的通信机制**:volatile、等待/通知机制、join 方式、InheritableThreadLocal、MappedByteBuffer
6767

Tool.md

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1614,19 +1614,14 @@ grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数
16141614
* -v:显示不包含匹配文本的所有行
16151615
* --color=auto :可以将找到的关键词部分加上颜色的显示
16161616

1617-
**管道符 |**:表示将前一个命令处理的结果传递给后面的命令处理
1617+
**管道符 |**:表示将前一个命令处理的结果传递给后面的命令处理
16181618

1619-
`grep aaaa Filename `:显示存在关键字 aaaa 的行
1620-
1621-
`grep -n aaaa Filename`:显示存在关键字 aaaa 的行,且显示行号
1622-
1623-
`grep -i aaaa Filename`:忽略大小写,显示存在关键字 aaaa 的行
1624-
1625-
`grep -v aaaa Filename`:显示存在关键字aaaa的所有行
1626-
1627-
`ps -ef | grep sshd`:查找包含 sshd 进程的进程信息
1628-
1629-
` ps -ef | grep -c sshd`:查找 sshd 相关的进程个数
1619+
* `grep aaaa Filename `:显示存在关键字 aaaa 的行
1620+
* `grep -n aaaa Filename`:显示存在关键字 aaaa 的行,且显示行号
1621+
* `grep -i aaaa Filename`:忽略大小写,显示存在关键字 aaaa 的行
1622+
* `grep -v aaaa Filename`:显示存在关键字aaaa的所有行
1623+
* `ps -ef | grep sshd`:查找包含 sshd 进程的进程信息
1624+
* ` ps -ef | grep -c sshd`:查找 sshd 相关的进程个数
16301625

16311626

16321627

@@ -2225,7 +2220,7 @@ pstree -A #查看所有进程树
22252220
* BIOS:基于 I/O 处理系统
22262221
* Bootloader:加载 OS,将 OS 放入内存
22272222
2228-
自举程序存储在内存中 ROM(BIOS 芯片),用来加载操作系统。CPU 的程序计数器指向 ROM 中自举程序第一条指令,当计算机**通电**,CPU 开始读取并执行自举程序,将操作系统(不是全部,只是启动计算机的那部分程序)装入 RAM 中,这个过程是自举过程。装入完成后 CPU 的程序计数器就被设置为 RAM 中操作系统的**第一条指令**所对应的位置,接下来 CPU 将开始执行操作系统的指令
2223+
自举程序存储在内存中 ROM(BIOS 芯片),**用来加载操作系统**。CPU 的程序计数器指向 ROM 中自举程序第一条指令,当计算机**通电**,CPU 开始读取并执行自举程序,将操作系统(不是全部,只是启动计算机的那部分程序)装入 RAM 中,这个过程是自举过程。装入完成后 CPU 的程序计数器就被设置为 RAM 中操作系统的**第一条指令**所对应的位置,接下来 CPU 将开始执行操作系统的指令
22292224
22302225
存储在 ROM 中保留很小的自举装入程序,完整功能的自举程序保存在磁盘的启动块上,启动块位于磁盘的固定位,拥有启动分区的磁盘称为启动磁盘或系统磁盘(C盘)
22312226

0 commit comments

Comments
 (0)