锁-Lock-04
2019-08-17 本文已影响0人
愤怒的奶牛
可重入锁
广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。ReentrantLock和synchronized都是可重入锁
/**
* 重入锁
*/
public class ReLock {
//锁的范围一样 this
public synchronized void add() {
System.out.println("add = "+ Thread.currentThread().getName());
sub();
}
// this
public synchronized void sub() {
System.out.println("sub = " + Thread.currentThread().getName());
}
public static void main(String[] args) {
ReLock reLock = new ReLock();
reLock.add();
}
输出:
"
add = main
sub = main
Process finished with exit code 0
- ReentrantLock 重入锁
//可重入锁
Lock lock = new ReentrantLock();
public void addTest() {
lock.lock();//加锁
System.out.println("addTest = "+ Thread.currentThread().getName());
lock.unlock();//释放锁
}
- ReentrantReadWriteLock 读写锁
public class RwLock {
private Map<String,String> cacheMap = new HashMap<>();
// 读写锁
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//读锁
private final Lock readLock = readWriteLock.readLock();
//写锁
private final Lock writeLock = readWriteLock.writeLock();
public String get(String key) {
try{
readLock.lock();//加锁,如果此时有写操作 ,当前读取数据的线程将会被阻塞
return cacheMap.get(key);
}finally {
readLock.unlock();//释放锁
}
}
public void set(String key, String value) {
try{
writeLock.lock();//写锁
cacheMap.put(key, value);
}finally {
writeLock.unlock();//释放锁
}
}
公平锁和非公平锁:
在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁
优缺点:
非公平锁性能高于公平锁性能。首先,在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。而且,非公平锁能更充分的利用cpu的时间片,尽量的减少cpu空闲的状态时间。
使用场景
使用场景的话呢,其实还是和他们的属性一一相关,举个栗子:如果业务中线程占用(处理)时间要远长于线程等待,那用非公平锁其实效率并不明显,但是用公平锁会给业务增强很多的可控制性。