之前的博客虽然是自己写的,但是也得经常回顾啊。

之前的博客虽然是自己写的,但是也得经常回顾啊。

刚才用到线程锁,但是又不敢确定用什么最好了。之前学习过,但使用不多,不够深刻,也没有很理解,有点遗忘了。

ReentrantLock 和Synchronized都是可重入锁,即本线程拥有锁以后可以再次执行进入锁所相关的代码而不会阻塞,只是count+1。

1、ReentrantLock的锁释放需要代码层面的lock(),unLock(),final(),必须将unLock()放到final中,而synchronized是JVM层面的,出现异常后会自动释放锁

2、ReentranLock有多种方式,

    a)  lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

    b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;

    c)tryLock(long timeout,TimeUnit unit),   如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;

    d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断

3、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

4、ReentranLock有公平锁和非公平锁两种策略实例化,公平锁是指当前线程A在拥有锁的时候,其他线程如B来申请会等待,等A释放的时候,会优先考虑B,而非公平的时候,是在A释放的时候,所有等待的线程一起同等竞争,对于B来说是非公平的。

猜你喜欢

转载自www.cnblogs.com/1023linlin/p/10129251.html