​ 显示锁 ​



本来打算写设计模式的,在周六日用了两天的时间全部看了一遍,但是写了一篇之后,发现,写的没有网上的好,感觉大家可能看不懂,所以打算继续写并发编程

设计模式,就给大家推荐一下菜鸟教程的吧,我看了一下,将的比较统一,都很不错

链接:https://www.runoob.com/design-pattern/design-pattern-tutorial.html

显示锁:

  显示锁是jdk1.5之后提供的一种锁

  Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显示的。


  ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性。又称为可重入锁。


Lock接口

 lock:加锁

lockInterruptibly:中断锁

tryLock:尝试获取锁,附带超时重载

unlock:释放锁

newCondition:获取一个Condition,Condition是一个用于线程之间通信的一个类



package org.dance.day4;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* lockDemo
* @author ZYGisComputer
*/
public class LockDemo {

private Lock lock = new ReentrantLock();

private int count;

/**
* 累加操作
*/
public void increment(){
// 加锁
lock.lock();
try {
count++;
}finally {
// 释放锁
lock.unlock();
}
}

public synchronized void incrementSync(){
count++;
// 可重入锁演示
incrementSync();
}

}


Lock使用三范式:

1:获取锁

2:写try finally

3:在finally中释放锁

总结:获取锁完毕后,一定要在之后的代码中,添加try finally并在finally块中释放锁,因为防止代码中抛出异常报错,导致锁无法释放

Lock接口和 Synchronized比较:

            Lock  Sync

使用方式        复杂  简单

获取锁是否可以被中断  可以  不可以

获取锁是否可以超时   可以  不可以

是否可以尝试获取锁   可以  不可以

是否可重入       可以  可以

是否可以读写分离    可以  不可以

是否是阻塞的      不是  是

可重入锁:

  什么是可重入锁?可重入锁就是支持一个线程对这个锁进行多次获取加锁,一般只有在递归一个加锁的方法的时候或者调用多个加锁的方法才会用到可重入锁,可重入锁获取了几次,就要释放几次,而Java的Synchronized和Lock接口都是提供锁的可重入的.

使用:

  一般来说,如果不是,业务特殊要求锁,需要可以中断,或者获取超时,或者尝试获取,读写分离的,推荐直接使用Synchronized

作者:彼岸舞

时间:2020\11\02

内容关于:并发编程

本文来源于网络,只做技术分享,一概不负任何责任