并发基础_6_并发_锁

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块中做,保证即使出现异常,也能释放锁,不影响其他线程使用。


说明:

由于个人原因,后续的并发学习笔记暂停更新...

后续会将工作中记录的现成笔记,整理好发上来...


你可能感兴趣的:(Java_并发基础)