Q
會導致死鎖?
2
A
回答
8
主題不能獲得通過另一個線程擁有的鎖。 但是一個 線程可以獲取它已經擁有的鎖。允許線程通過 多次獲取同一個鎖使得可重入 同步。這描述了一種情況,其中同步代碼 直接或間接地調用也包含 同步代碼的方法,並且這兩組代碼使用相同的鎖。
7
沒記錯,折返意味着相同的線程可以得到相同的鎖幾次,如:
private final Object lock = new Object();
public void foo() {
synchronized(lock) {
bar();
}
}
public void bar() {
synchronized(lock) {
//...
}
}
作品如預期,以及(在這裏this
作爲一個隱含的鎖定對象):
public synchronized void foo() {
bar();
}
public synchronized void bar() {
//...
}
並且沒有發生死鎖。當然,其他線程既不能同時訪問foo()
也不能訪問bar()
,因爲鎖已被佔用。
底線:鎖是通過線程進行的,而不是通過代碼的方法/塊進行的。並且獲得同一個線程已經獲得的鎖定是沒有任何操作的。
0
每object
有lock and a key
保護其crucial data state
, 所以沒有every Class has a lock and a key
以保護其crucial static data state.
synchronized keyword on the atomic statements
(任何一種方法或霧化語句)
會像鎖定的對象。當一個線程訪問該方法或原子語句時,它必須獲取key for that object
。
Once it obtains the key,
its free to access this synchronized method/statement
or any other synchronized method/statement of that object.
Thats what reentrant is all about.
但是沒有其他的線程將能夠訪問這個對象的同步化塊,直到當前的鍵持有線程,放開鍵。
相關問題
- 1. Ruby:open會導致死鎖
- 2. AutoResetEvent.WaitOne()導致死鎖
- 3. Thread.Join()導致死鎖
- 4. pthread_mutex_lock導致死鎖
- 5. 這怎麼會導致死鎖?
- 6. INSERT操作是否會導致死鎖?
- 7. 爲什麼這不會導致死鎖
- 8. 我的GetEnumerator會導致死鎖嗎?
- 9. 此代碼是否會導致死鎖?
- 10. MemoryStream.CopyTo()導致線程死鎖
- 11. 導致死鎖的SQLBulkCopy
- 12. 運行PIP導致死鎖
- 13. 鎖定釋放會在Neo4j中導致死鎖
- 14. 只使用關鍵部分的讀/寫鎖會導致死鎖
- 15. 如何在concurrent.futures.ThreadPoolExecutor中使用不會導致死鎖的鎖?
- 16. 爲什麼嵌套鎖不會導致死鎖?
- 17. 硬件發生「死鎖」還是軟件導致死鎖?
- 18. 線程關閉導致的死鎖
- 19. Java MySQL可能導致死鎖?
- 20. 可以使用sem_trywait()導致死鎖
- 21. JxBrowser導致線程死鎖120秒
- 22. WCF服務導致SQL死鎖錯誤
- 23. 如何成功導致死鎖
- 24. 導致死鎖的SQL更新
- 25. 此代碼如何導致死鎖?
- 26. 異步等待導致死鎖
- 27. pthread_mutex_lock和pthread_cond_wait/signal導致死鎖
- 28. 導致死鎖錯誤的SQL查詢
- 29. Javascript Ajax可能導致死鎖嗎?
- 30. 調用Runtime.getRuntime()。EXEC(...)導致死鎖
如何使用Google搜索一下? –