公平锁与非公平锁、可重用锁、自旋锁、读写锁代码验证

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

一、公平锁与非公平锁

公平锁: 是指多个线程竞争同一资源时[等待同一个锁时],获取资源的顺序是按照申请锁的先后顺序的;公平锁保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁;
基本特点: 线程执行会严格按照顺序执行,等待锁的线程不会饿死,但整体效率相对比较低;

非公平锁: 是指多个线程竞争同一资源时,获取资源的顺序是不确定的,一般是抢占式的;非公平锁相对公平锁是增加了获取资源的不确定性,但是整体效率得以提升;
基本特点: 整体效率高,线程等待时间片具有不确定性;

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值