CIP - avoid liveness hazards

    We use lock to ensure thread safety, but indiscriminate use of locking can cause lock-ordering deadlocks.
java

    

# deadly embraceapp

When thread A holds lock L and try to acquire lock M, but at the same time thread B holds lock M and try to acquire lock L, both threads will wait forever.
dom


# lock-ordering deadlockide

This problem come about when two threads attempt to acquire the same locks in different order.
ui

A program will be free of lock-ordering deadlocks if all threads acquire the locks they need in a fixed order.this

/** code sample for lock-ordering deadlock */
public class LeftRightlock {
	
	private final Object left = new Object();
	private final Object right = new Object();
	
	public void leftRight() {
		synchronized (left) {
			synchronized (right) {
				// ...
			}
		}
	}
	
	public void rightLeft() {
		synchronized (right) {
			synchronized (left) {
				// ...
			}
		}
	}
}


# dynamic lock order deadlockspa

in fact, the lock order depends on the order of arguments passed to the method:
code

public void transferMoney(final Account fromAcct, 
                          final Account toAcct, 
                          final double amount) throws Exception {
    synchronized (fromAcct) {
        synchronized (toAcct) {
            if (fromAcct.getBalance() < amount) {
                throw new Exception("insufficient balance");
            } else {
                fromAcct.debitt(amount);
                toAcct.credit(amount);
            }
        }
    }
}

to solve the above problem, we can use System.identityHashCode(obj) to decide the order.orm


# Avoid deadlockci

One technique for detecting and recovering from deadlocks is to use timed tryLock of the explicit lock instead of intrinsic locking.


#starvation

Startvation occurs when a thread perpetually denied access to resources it needs.

Starvation can be caused by inappropriate use of thread priorities.


# priority

The thread API defines 10 priority levels that JVM can map to OS scheduling priorities, this mapping is platform-specific. Some different java priorities can map to same OS priority.


# livelock

Livelock is also a form of liveness failure in which a thread, while not blocked, still cannot make progress because it keeps retrying an operation that will always fail.

The solution for livelock is to introduce some randomness into retry mechanism.

相關文章
相關標籤/搜索