Java中的锁
Lock接口
锁是用来控制多个线程访问共享资源的,一般来说,锁能够防止多个线程同事访问共享资源(有些锁允许多线程并发访问共享资源,比如读写锁)
在Lock接口出现之前,Java程序靠synchronized关键字实现锁的功能。
在JavaSE5 之后,并发包中新增Lock接口用来实现锁功能,功能上讲与synchronized关键字类似;
Lock需要在代码中显示的获取和释放锁,而synchronized是隐式的(不用再代码中体现);
但是Lock更加灵活,具备很多synchronized不具备的特性(获取/释放锁的可操作性,超时获取锁等)
synchronized关键字隐式的获取释放锁,它将锁的获取和释放固化了,必须先获取再释放。
这样子虽说简化了同步操作的管理,但是扩展性没有显示的获取、释放锁来的好。
我们举个栗子:(原书中的栗子)
针对一个场景,手把手进行锁获取和释放,
先获得锁A,然后再获取锁B,
当锁B获得后,
释放锁A同时获取锁C,
当锁C获得后,再释放B同时获取锁D,以此类推。
这种场景下,synchronized关键字就不那么容易实现了
上面这种场景,说实话,因楼主所在行业业务限制,我从来没遇到过,原文只是想体现下lock比synchronized要好吧..
上面的这种场景使用synchronized实现起来会非常困难吧,因为锁的获取与释放我们自己没法控制...
但是使用Lock接口就比较方便,因为Lock锁的获取和释放在我们自己的手里,样例Demo:
Lock lock = new ReentrantLock();
lock.lock();
try {
//do something..
} finally {
lock.unlock();
}
获取锁不要写在try块中,如果获取锁的时候出现了异常,异常向上抛出,会导致锁的无故释放(还没获取到锁就释放,是这个意思吗)
锁的释放,强烈建议放在finally块中做,保证即使出现异常,也能释放锁,不影响其他线程使用。
说明:
由于个人原因,后续的并发学习笔记暂停更新...
后续会将工作中记录的现成笔记,整理好发上来...