Files
Hui-s-notebook/logseq-java/pages/synchronized.md
2024-02-02 00:12:49 +08:00

55 lines
1.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
- 特点
- 互斥
- 当某个线程获得对象锁之后,其它线程不能再次抢占同样对象锁
- 重入
- 当根线程获得对象锁之后,它的其它方法依旧可以抢占同样的对象锁
- Java对锁的支持
- Synchronized关键字
- 同步代码块
- 放置在方法内部
- 可以灵活控制加锁代码的区域
- ```java
synchronized(对象){
//锁定的代码
}
```
- 同步方法
- Lock接口
- 对比
- Lock可以通过tryLock()判断锁的状态synchronized无法判断
- synchronized自动释放锁Lock需要手动unlock(),不释放变为死锁
- synchronized线程间需要不断等待Lock不一定
- synchronized可重入不可中断非公平锁Lock可重入可中断可公平与不公平
- synchronized适合锁定代码量非常少Lock适合锁定代码量非常多
- 锁升级
- synchronized根据线程数量决定锁的力度
- 无锁
- 刚创建,未引用
- 偏向锁
- 1根线程操作该对象
- 轻量级
- 2根线程同时操作该对象
- 重量级
- 2根以上线程同时操作该对象
- 锁只有升级,没有降级
- 面试题 #Java面试
- ```java
synchronized(this){}
// 获得当前对象的锁
```
- ```java
synchronized(user){}
// 获得user对象的锁
```
- ```java
synchronized(Object.class){}
// 获得Object class 类对象的锁
```
- ```java
public synchronized boolean sell(){}
// 获得当前对象的锁
```
- ```java
public synchronized boolean sell(){}
// 获得当前类的Class对象的锁
```