Blu*_*ond -1 java multithreading synchronization deadlock
如何在第8或第16行发生死锁?
1. public class DeadlockRisk {
2. private static class Resource {
3. public int value;
4. }
5. private Resource resourceA = new Resource();
6. private Resource resourceB = new Resource();
7. public int read() {
8. synchronized(resourceA) {
9. synchronized(resourceB) {
10. return resourceB.value + resourceA.value;
11. }
12. }
13. }
14
15. public void write(int a, int b) {
16. synchronized(resourceB) {
17. synchronized(resourceA) {
18. resourceA.value = a;
19. resourceB.value = b;
20. }
21. }
22. }
23. }
Run Code Online (Sandbox Code Playgroud)
可能会发生死锁,因为锁定顺序不一致,这意味着一个线程可以获取resourceA并等待resourceB另一个线程已经获取resourceB但正在等待resourceA.例如:
read(),成功获取resourceA,然后暂停.write(),成功获取resourceB并等待resourceA.resourceB(永远不会释放T2).无论是T1或T2可能发展,因为每个资源上的其他已锁定等待.始终拥有一致的锁定顺序:
public int read() {
synchronized(resourceA) {
synchronized(resourceB) {
public void write() {
synchronized(resourceA) {
synchronized(resourceB) {
Run Code Online (Sandbox Code Playgroud)
(但是,在发布的代码中,似乎没有理由拥有多个锁,因为总是获取两个锁.)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |