void lock(); //获取锁 void lockInterruptibly() throws InterruptedException; //获取锁,且当前线程可被中断 boolean tryLock(); //尝试获取锁,true获取到锁, false未获取到锁 boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); //释放锁 Condition newCondition(); //在当前锁上建立一个等待条件
Lock lock = new ReentrantLock(); lock.lock(); try{ // to do sth. } finally{ lock.unlock(); //需要在finally中释放锁 }
public boolean transferMoney(Account fromAcct, Account toAcct, int amount, long timeout, TimeUnit unit){ long fixedDelay = getFixedDelayComponentNanos(timeout, unit); long randMod = getRandomDelayModulusNanos(timeout, unit); long stopTime = System.nanoTime() + unit.toNanos(timeout); while (true){ if (fromAcct.lock.tryLock()){ //若获取到源帐户锁 try{ if (toAcct.lock.tryLock()){ //若获取到目的帐户锁 try{ if (fromAcct.getBalance() < amount){ throw new RuntimeException("money.not.enough"); } else{ fromAcct.debit(amount); toAcct.credit(amount); return true; } } finally{ toAcct.lock.unlock(); } } } finally{ fromAcct.lock.unlock(); } } if (System.nanoTime() < stopTime){ return false; } try { Thread.sleep(fixedDelay + rand.nextLong()%randMod); } catch (InterruptedException e) { } } }你也能够采用定时实现:
lock.tryLock(timeout, unit);
lock.lockInterruptibly(); try{ // maybe throws InterruptedException doSomething(); } finally{ lock.unlock(); }
//读写锁容许同时多个线程读, 或最多一个线程写 public interface ReadWriteLock { Lock readLock(); Lock writeLock(); }
1. 释放优先。当写入锁释放后,应该优先选择读线程,写线程,仍是最早发出请求的线程? java
2. 读线程插队。锁由读线程持有,写线程再等待,再来一个读线程,是继续让读线程访问,仍是让写线程访问. 并发
3. 重入性。读取锁和写入锁是否可重入? dom
4. 降级。将写入锁降级为读取锁。 高并发
5. 升级。将读取锁升级为写入锁。 工具
/** * 读写锁来包装Map */ public class ReadWriteMap<K, V> { private final Map<K, V> map; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock r = lock.readLock(); private final Lock w = lock.writeLock(); public ReadWriteMap(Map<K, V> map){ this.map = map; } // 其余写操做... public V put(K key, V value){ w.lock(); //请求写锁 try{ return map.put(key, value); } finally{ w.unlock(); //勿忘 } } // 其余读操做... public V get(K key){ r.lock(); //请求读锁 try{ return map.get(key); } finally{ r.unlock(); //勿忘 } } }
不吝指正。 性能