Sychronized
锁住代码块,执行代码块。
释放锁:
1.获取锁的线程执行完,并释放锁的占有
2.执行发生异常,JVM让线程自动释放锁
缺点:
1.异常只会被抛出,不能被解决,维护系统正常
Lock
public interface Lock{
void lock();//获取锁,锁已被其他线程获取,进行等待
void lockInterruptibly()throws InterruptedException;
boolean tryLock();//success->true;fail->false
boolean tryLock(long time,TimeUnit unit)throws InterruptedException;
void unlock();
Condition newCondition();
}
<lock()>
Lock lock=new ReentrantLock();//ReentrantLock实现了Lock,拥有相同的并发性和内存语义
//有与锁相关的获取计数器,拥有锁的某个线程再次得到锁,+1,e.g.退出第二个synchronized块,不释放锁,退出第一个synchronized块,释放锁
try{
}finally{
lock.unlock();//在finally中,确保锁一定被释放
}
//lock 必须在finally中释放,否则抛出异常
<tryLock()>
boolean captured=lock.tryLock();
try{
}finally{
if(captured)
lock.unlock();
else
.....//未获取到锁
}
<tryLock(long time,TimeUnit)throws InterruptedException;>
try{
boolean captured=tryLock(2,TimeUnit.SECONDS);
}catch(InterrupedException e){
throw new RuntimeException(e);
}
try{
}finally{
if(captured)
lock.unlock();
else
....}
////////////////////看到了有趣的。。。用于遍历链接列表中的节点的节点传递的加锁机制
///////////////////先到这