#### 死鎖預防
1. **加鎖順序:**當多個線程需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發生。如果能確保所有的線程都是按照相同的順序獲得鎖,那么死鎖就會發生。然而很多時候是無法預知的。
2. **加鎖時限:**加上一個超時時間,若一個線程沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退并釋放所有已經獲得的鎖,然后等待一段時間后進行重試。但是如果有非常多的線程同一時間去競爭同一批資源,就算有超時和回退機制,還是可能會導致這些線程重復的嘗試但缺始終得不到鎖
3. **死鎖檢測:**死鎖檢測即當一個線程獲得了鎖,會在線程和鎖的相關數據結構中將其記下。除此之外,每當有現成請求鎖,也需要記錄在這個數據結構中。死鎖檢測是一個更好的死鎖預防機制,它主要針對哪些不可能實現按序加鎖并且鎖超時也不可行的場景。
**線程池死鎖**
> f1 等待 f2,由于線程池是signle的所有 f2也會等f1
```
final ExecutorService executorService = Executors.newSingleThreadExecutor();
Future f1 = executorService.submit(new Callable() {
public Long call() throws Exception {
System.out.println("start f1");
Thread.sleep(1000);//延時
Future f2 = executorService.submit(new Callable() {
public Long call() throws Exception {
System.out.println("start f2");
return -1L;
}
});
System.out.println("result" + f2.get());
System.out.println("end f1"); return -1L;
}
});
```
- 虛擬機
- JVM內存結構
- JVM調優手段
- java對象生命周期
- 垃圾回收判斷對象死亡
- 垃圾回收算法
- 垃圾收集器
- JAVA基礎知識
- java事件機制
- java反射機制
- jvm創建對象
- java異常
- finally語句一定會執行嗎?
- 集合類介紹
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- 多線程
- 為什么要使用線程池
- 線程死鎖
- 死鎖檢測和解除
- jstack
- jconsole
- 死鎖預防
- 常見線程池
- 線程池參數
- 工作隊列介紹
- 拒絕策略
- ThreadLocal
- CAS
- ReentrantLock
- AQS
- CountDownLatch
- Spring
- spring中bean的作用域
- REDIS
- redis數據結構
- redis hash實現
- redis rehash與hashmap擴容的區別
- Redis使用場景
- Redis為何這么快
- redis連接數不足導致錯誤
- 分布式
- 分布式事務
- ACID
- CAP
- BASE
- 事務隔離性
- 一致性哈希算法
- 負載均衡算法
- Hystrix 信號量和線程池隔離的差異
- Spring Cloud
- eureka
- MYSQL
- mysql優化經驗
- undo redo binlog
- web
- http協議
- http和https區別
- Cookie和session
- TCP三次握手、4次揮手
- TCP的time_wait和close_wait
- 算法問題
- 編輯距離算法
- MQ
- RabbitMq
- Kafka
- 安裝教程
- Win ELK安裝