一、公平锁与非公平锁
公平锁: 是指多个线程竞争同一资源时[等待同一个锁时],获取资源的顺序是按照申请锁的先后顺序的;公平锁保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁;
基本特点: 线程执行会严格按照顺序执行,等待锁的线程不会饿死,但整体效率相对比较低;
非公平锁: 是指多个线程竞争同一资源时,获取资源的顺序是不确定的,一般是抢占式的;非公平锁相对公平锁是增加了获取资源的不确定性,但是整体效率得以提升;
基本特点: 整体效率高,线程等待时间片具有不确定性;
ReentrantLock构造函数中可以直接传入一个boolean值fair,对公平性进行设置。当fair为true时,表示此锁是公平的,当fair为false时,表示此锁是非公平的锁;
ReentrantLock fairLock = new ReentrantLock(true);//公平的
ReentrantLock unFairLock = new ReentrantLock();//非公平的
二、可重用锁
可重用锁也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA中ReentrantLock 和synchronized 都是可重入锁;
ReenTrantLock原理:ReenTrantLock的实现是一种自旋锁,通过循环调用CAS操作来实现加锁。
2.1 ReenterLockDemo
package com.zhang;
import java.util.concurrent.TimeUnit;
public class ReenterLockDemo {
//synchronized和ReenterLock均为重用锁演示,其中synchronized是非公平锁,ReenterLock默认非公平锁
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(()->{
try {
phone.sendMS();
}catch(Exception e){
e.printStackTrace();
}
},"t1").start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
try {
phone.sendMS();
}catch(Exception e){
e.printStackTrace();
}
},"t2").start();
}
public static class Phone{
public synchronized void sendMS

本文深入探讨了Java中的锁机制,包括公平锁与非公平锁的区别、可重入锁的使用方法、自旋锁的工作原理及优缺点,以及读写锁的特点和应用案例。
最低0.47元/天 解锁文章
144

被折叠的 条评论
为什么被折叠?



