1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

multi-thread/2020最新Java并发进阶常见面试题总结 排版修正

This commit is contained in:
2293736867 2021-06-03 19:01:13 +08:00
parent 0607a18a1f
commit 19b31d4e59

View File

@ -12,7 +12,7 @@
- [1.3. 构造方法可以使用 synchronized 关键字修饰么?](#13-构造方法可以使用-synchronized-关键字修饰么)
- [1.3. 讲一下 synchronized 关键字的底层原理](#13-讲一下-synchronized-关键字的底层原理)
- [1.3.1. synchronized 同步语句块的情况](#131-synchronized-同步语句块的情况)
- [1.3.2. `synchronized` 修饰方法的的情况](#132-synchronized-修饰方法的的情况)
- [1.3.2. synchronized 修饰方法的的情况](#132-synchronized-修饰方法的的情况)
- [1.3.3.总结](#133总结)
- [1.4. 说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗](#14-说说-jdk16-之后的-synchronized-关键字底层做了哪些优化可以详细介绍一下这些优化吗)
- [1.5. 谈谈 synchronized 和 ReentrantLock 的区别](#15-谈谈-synchronized-和-reentrantlock-的区别)
@ -167,11 +167,11 @@ public class Singleton {
```java
public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("synchronized 代码块");
}
}
public void method() {
synchronized (this) {
System.out.println("synchronized 代码块");
}
}
}
```
@ -194,13 +194,13 @@ public class SynchronizedDemo {
在执行 `monitorexit` 指令后,将锁计数器设为 0表明锁被释放。如果获取对象锁失败那当前线程就要阻塞等待直到锁被另外一个线程释放为止。
#### 1.3.2. `synchronized` 修饰方法的的情况
#### 1.3.2. synchronized 修饰方法的的情况
```java
public class SynchronizedDemo2 {
public synchronized void method() {
System.out.println("synchronized 方法");
}
public synchronized void method() {
System.out.println("synchronized 方法");
}
}
```
@ -277,7 +277,7 @@ JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、
![JMM(Java内存模型)](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/0ac7e663-7db8-4b95-8d8e-7d2b179f67e8.png)
要解决这个问题,就需要把变量声明为**`volatile`**,这就指示 JVM这个变量是共享且不稳定的每次使用它都到主存中进行读取。
要解决这个问题,就需要把变量声明为 **`volatile`** ,这就指示 JVM这个变量是共享且不稳定的每次使用它都到主存中进行读取。
所以,**`volatile` 关键字 除了防止 JVM 的指令重排 ,还有一个重要的作用就是保证变量的可见性。**
@ -293,7 +293,7 @@ JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、
`synchronized` 关键字和 `volatile` 关键字是两个互补的存在,而不是对立的存在!
- **`volatile` 关键字**是线程同步的**轻量级实现**,所以**`volatile `性能肯定比` synchronized `关键字要好**。但是**`volatile` 关键字只能用于变量而 `synchronized` 关键字可以修饰方法以及代码块**。
- **`volatile` 关键字**是线程同步的**轻量级实现**,所以 **`volatile `性能肯定比` synchronized `关键字要好** 。但是 **`volatile` 关键字只能用于变量而 `synchronized` 关键字可以修饰方法以及代码块 **
- **`volatile` 关键字能保证数据的可见性,但不能保证数据的原子性。`synchronized` 关键字两者都能保证。**
- **`volatile`关键字主要用于解决变量在多个线程之间的可见性,而 `synchronized` 关键字解决的是多个线程之间访问资源的同步性。**